使用JS+plupload直接批量上传图片到又拍云


Posted in Javascript onDecember 01, 2014

论坛或者贴吧经常会需要分享很多图片,上传图片比较差的做法是上传到中央服务器上,中央服务器再转发给静态图片服务器。而这篇文章讲介绍如何使用plupload对上传过程进行优化,并绕过服务器直接批量上传图片到又拍云上的方法。本文集中会讲到以下几个重点:

plupload库

图片的本地压缩

多选图片

绕过服务器直接批量上传图片到又拍云

使用又拍的HTTP FORM API

plupload的配置

plupload库

plupload是一个支持非常丰富的图片上传插件。可以对低版本的浏览器通过Flash/Silverligh/html4支持批量上传,而在高版本浏览器中则会优先使用html5接口上传,这一切的判定都是自动的,可以说使用起来非常方便!其次plupload还支持在客户端压缩图片、直接Drag&Drop来上传等功能,具体大家就可以到它的官网上了解更多的信息。

在这里我们仅使用它的核心API,只需要引入一个文件即可。

<script src="lib/plupload-2.1.2/js/plupload.full.min.js"></script>

官方给出的核心API例子非常简单,可以直接移步http://www.plupload.com/examples/core查看。核心API在理解上不存在什么困难,如果需要帮助可以在本文后面向我提问。

图片的本地压缩

一般在网页中浏览的图片质量需求不高,记得当初高中上课学PS,老师说网上的图片分辨率设72就好了,打印的图片的话得设300。所以用户在上传一张很大的照片时,比较好的做法是现在用户的客户端本地压缩好这张图片,并把压缩后较小的图片上传,既不影响浏览效果,同时也能加快上传速度,减小服务器的负担。

图片的本地压缩功能在plupload中是支持的,只要在初始化它的时候传入一个resize参数就好了。其中,宽度和高度可以根据实际情况设置,而quality是比较重要的一个参数,顾名思义,这个值设置得越小,图片越小,但显示的质量也会越差,这个就需要你自己权衡一下啦。

{

    "resize": {

        "width": 200,

        "height": 200,

        "quality": 70

    }

}

多选图片

批量上传图片的一个前置条件就是能够多选图片。多选文件是HTML5的一个标准特性,我们可以通过如下方式来开启多选模式:

<form action="xxx">

  Select images: <input type="file" name="img" multiple> <!-- multiple 在这儿是关键!-->

  <input type="submit">

</form>

根据一个非常优秀的jquery插件jQuery-File-Upload的浏览器支持中Multiple File selection这个小节所写的那样,IE一直发展到IE10才刚开始支持这个HTML5的特性,那么我们又不得不借助Flash神奇的力量来对低版本浏览器进行多选图片的支持。幸运的是plupload已经帮我们做到了这一点,而且这一开关是默认开启的。如果你觉得你不需要用到多选图片,你可以设置multi_selection: false来关闭这个特性。

绕过服务器直接批量上传图片到又拍云

又拍云提供了HTTP FORM API。通过这个接口,我们就可以直接从浏览器端发起上传图片的请求,而不需要通过我们自己的服务器进行中转,大大降低了开销。

使用又拍的HTTP FORM API

使用这个接口,就需要向又拍云发送一个表单。这个表单包含你所要上传的文件,并且还需要包含policy和signature。Policy用于将上传请求相关的参数,例如保存路径,文件类型,预处理结果等,另外,也包含了上传请求授时间等。而Signature用于安全校验。

为了演示方便,此处直接使用javascript来生成Policy和Signature。但在实际使用中,为了安全性考虑,请在服务器端完成这个过程。下面的代码在官方的demo基础上做了些许修改,主要是使用了官方的测试帐号,关于这两个参数的具体生成方法,请参考官方的文档:http://docs.upyun.com/api/form_api/。

var options = {

    'bucket': 'demonstration',

    'save-key': '/test/filename.txt',

    'expiration': Math.floor(new Date().getTime() / 1000) + 86400

};

// 查看更多参数:http://docs.upyun.com/api/form_api/#表单API接口简介

var policy = window.btoa(JSON.stringify(options));

// 从 UPYUN 用户管理后台获取表单 API

var form_api_secret = '1+JY2ZqD5UVfw6hQ8EesYQO50Wo=';

// 计算签名

var signature = md5(policy + '&' + form_api_secret);

plupload的配置

如何使得plupload可以配合又拍云的HTTP FORM API,着实让我头疼了一番。在查看plupload的文档中,无意中的发现却让我看到了曙光,Upload to Amazon S3这个链接吸引了我。Amazon S3的全称是Amazon Simple Storage Service,它提供的云存储服务多多少少和又拍云有些相似。

于是根据这篇文章中关于浏览器端配置的介绍,我琢磨出了上传到又拍云所需要的配置。其实说起来也很简单,主要就是对url和multipart_params两个参数进行配置。下面的例子中的options.bucket、policy和signature直接使用上一节计算出来的值。

var uploader = new plupload.Uploader({

    ...

    url : 'http://v0.api.upyun.com/' + options.bucket,

    multipart_params: {

        'Filename': '${filename}', // adding this to keep consistency across the runtimes

        'Content-Type': '',

        'policy': policy,

        'signature': signature,

    },

    ...

});

总结

如此这般,终于实现了通过plupload绕过服务器,向又拍云批量上传图片了。plupload真是一个很强大的库,不过它对商业使用可以需要收费的哦,具体还是到它的官网上去了解吧!

是不是很简单呢,主要是思路很不错,值得我们去学习,有问题请跟我留言,大家共同进步

Javascript 相关文章推荐
js如何取消事件冒泡
Sep 23 Javascript
JavaScript避免代码的重复执行经验技巧分享
Apr 17 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
Sep 14 Javascript
js原生跨域_用script标签的简单实现
Sep 24 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
Jan 20 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 Javascript
jQuery层级选择器_动力节点节点Java学院整理
Jul 04 jQuery
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
Aug 18 Javascript
详解AngularJS1.x学习directive 中‘&amp; ’‘=’ ‘@’符号的区别使用
Aug 23 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
vue路由对不同界面进行传参及跳转的总结
Apr 20 Javascript
JavaScript事件的委托(代理)的用法示例详解
Feb 18 Javascript
关于javascript模块加载技术的一些思考
Nov 28 #Javascript
jQuery实现Twitter的自动文字补齐特效
Nov 28 #Javascript
关于编写性能高效的javascript事件的技术
Nov 28 #Javascript
推荐25个超炫的jQuery网格插件
Nov 28 #Javascript
实例分析javascript中的call()和apply()方法
Nov 28 #Javascript
深入理解javascript严格模式(Strict Mode)
Nov 28 #Javascript
jquery+php实现搜索框自动提示
Nov 28 #Javascript
You might like
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
PHP 高级课程笔记 面向对象
2009/06/21 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
Ruffy javascript 学习笔记
2009/11/30 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
以一段代码为实例快速入门Python2.7
2015/03/31 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
Python小白学习爬虫常用请求报头
2020/06/03 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
银行介绍信范文
2014/01/10 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
部队2014年终工作总结
2014/11/27 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB