使用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 相关文章推荐
jquery 倒计时效果实现秒杀思路
Sep 11 Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 Javascript
json实现添加、遍历与删除属性的方法
Jun 17 Javascript
BootStrap实现手机端轮播图左右滑动事件
Oct 13 Javascript
javascript读取文本节点方法小结
Dec 15 Javascript
前端 Vue.js 和 MVVM 详细介绍
Dec 29 Javascript
基于JS实现翻书效果的页面切换样式
Feb 16 Javascript
JS中的回调函数实例浅析
Mar 21 Javascript
微信小程序用户信息encryptedData详解
Aug 24 Javascript
vuex 动态注册方法 registerModule的实现
Jul 03 Javascript
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
vue实现同时设置多个倒计时
May 20 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
Angular的$http与$location
2016/12/26 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
Python3 socket同步通信简单示例
2017/06/07 Python
详解Python self 参数
2019/08/30 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
公司法人授权委托书范本
2014/09/12 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
2015年新学期寄语
2015/02/26 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python