使用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 相关文章推荐
Document 对象的常用方法
Jul 31 Javascript
动感效果的TAB选项卡jquery 插件
Jul 09 Javascript
jquery.cookie.js使用指南
Jan 05 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
jQuery图片左右滚动代码 有左右按钮实例
Jun 20 Javascript
多种方式实现js图片预览
Dec 12 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
node.js express框架简介与实现
Jul 23 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
Aug 05 Javascript
Vue中父子组件的值传递与方法传递
Sep 28 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
关于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获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
python3 pygame实现接小球游戏
2019/05/14 Python
python按比例随机切分数据的实现
2019/07/11 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
销售人员职业生涯规划范文
2014/03/01 职场文书
出纳担保书范文
2014/04/02 职场文书
校园文明标语
2014/06/13 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
Pandas 稀疏数据结构的实现
2021/07/25 Python