目的
本教程的目录是通过三个例子介绍如何在html表单提交直传oss
第一个例子:讲解如何在js直接签名,直接表单上传到oss
第二个例子:讲解如何在从后端php获取签名,然后直接表单上传到oss
第三个例子:讲解如何在从后端php获取签名及上传后回调。然后直接表单上传到oss,oss回调完应用服务器再返回给用户。
背景
每个用oss的用户,都会用到上传。由于是网页上传,其中包括一些app里面的h5页面,对上传的需求很强烈,很多人采用的做法是用户在浏览器/app上传到应用服务器,然后应用服务器再把文件上传到oss。
这种方法有三个缺点,
第一:上传慢,先上传到应用服务器,再上传到oss,网络传送多了一倍,而且oss是采用bgp带宽,能保证各地各运营商的速度。
第二:扩展性不好,如果后续用户多了,应用服务器会成为瓶颈。
第三:费用高,因为oss上传流量是免费的。如果数据直传到oss,不走应用服务器。那么将能省下几台应用服务器。
改进方案1:客户端用js直接签名,然后上传到oss
示例
下面我将介绍用plupload ,在js端签名然后直传数据到oss的例子
样例: http://oss-demo.aliyuncs.com/oss-h5-upload-js-php/index.html
二维码:可以用手机(微信,qq,手机浏览器等)扫一扫试试
原理
本例子的功能
1.采用plupload 直接提高表单数据(即postobject)到oss
2.支持html5,flash,silverlight,html4 等协议上传
3. 可以运行在pc浏览器,手机浏览器,微信等
4.可以选择多文件上传
5.显示上传进度条
6.可以控制上传文件的大小
oss的postobject api细节可以参照(看不懂没有关系):
https://docs.aliyun.com/#/pub/oss/api-reference/object&postobject
plupload
plupload是一款简单易用且功能强大, 拥有多种上传方式,(html5, flash, silverlight, html4)等方式,会智能检测当前环境
选择最适合的方式,并且会优先采用html5, 所以不用花心思去当前的浏览器要用何种方式上传,plupload会帮您考虑好。
关键代码
因为oss原生支持post协议。所以只要将plupload在发送post请求时,带上oss签名即可。
核心代码如下:
var uploader = new plupload.uploader({ runtimes : 'html5,flash,silverlight,html4', browse_button : 'selectfiles', //runtimes : 'flash', container: document.getelementbyid('container'), flash_swf_url : 'lib/plupload-2.1.2/js/moxie.swf', silverlight_xap_url : 'lib/plupload-2.1.2/js/moxie.xap', url : host, multipart_params: { 'filename': '${filename}', 'key' : '${filename}', 'policy': policybase64, 'ossaccesskeyid': accessid, 'success_action_status' : '200', //让服务端返回200,不然,默认会返回204 'signature': signature, }, ....}
签名signature主要是对policytext进行签名,最简单的例子如下:
var policytext = { expiration: 2020-01-01t12:00:00.000z, // 设置该policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了 conditions: [ [content-length-range, 0, 1048576000] // 设置上传文件的大小限制,如果超过了这个大小,文件上传到oss会报错的 ]}
cors(跨域访问)
注意:如果一定要保证bucket属性cors设置支持post方法。因为这个html直接上传到oss,会产生跨域请求。必须在bucket属性里面设置允许跨域, 可以在oss控制台里面设置
设置如下图:
代码下载
http://files.cnblogs.com/files/ossteam/oss-h5-upload-js-direct.tar.gz