使用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 相关文章推荐
javascript 控制弹出窗口
Apr 10 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
Oct 22 Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 Javascript
JavaScript中自带的 reduce()方法使用示例详解
Aug 10 Javascript
Bootstrap源码解读排版(1)
Dec 23 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 Javascript
vue如何判断dom的class
Apr 26 Javascript
vue 引用自定义ttf、otf、在线字体的方法
May 09 Javascript
layui 数据表格复选框实现单选功能的例子
Sep 19 Javascript
OpenLayers3实现鼠标移动显示坐标
Sep 25 Javascript
canvas多重阴影发光效果实现
Apr 20 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 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
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
Django实现单用户登录的方法示例
2019/03/28 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
开学典礼感言
2014/02/16 职场文书
2014年创卫实施方案
2014/02/18 职场文书
工程项目建议书范文
2014/03/12 职场文书
六五普法规划实施方案
2014/03/21 职场文书
政风行风评议心得体会
2014/10/21 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
MySQL日期时间函数知识汇总
2022/03/17 MySQL