OSS Web直传——使用Flash上传

OSS Web直传使用案例:点击这里


好的。今天我讲解一下Flash上传的示例。
 
Flash上传我还是采用pupload上传插件。做法是将 pupload 的runtimes 改成:flash
 
var uploader = new plupload.Uploader({
    browse_button : 'selectfiles',
    runtimes : 'flash',  //设成flash,就是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',

 
Flash上传跟Html5 上传的区别与联系
 
两者采用上传的协议都是POST,  发送请求的内容格式是一样。唯一的区别在于对于跨域的设置,
Hmlt5是采用Cors的设置。 而Flash是采用获取crossdomain.xml的方式
 
 
Flash上传流程
即客户端flash上传时,会向上传的源站请求一个crossdomain.xml,flash通过crossdomain.xml的内容,判断本次上传是否符合规则。所以如果您的bucket想要支持flash上传,你的bucket必须有一个名字叫crossdomain.xml的object存在。
 
 
crossdomain.xml
crossdomain.xml的内容定义了对于上传的授权策略
具体细节可以参考:http://www.adobe.com/cn/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html
这里我定义一个最简单的上传策略

<?xml version="1.0"?> 
<cross-domain-policy><site-control permitted-cross-domain-policies="master-only"/> 
<allow-access-from domain="*"/> 
</cross-domain-policy>


 将该crossdomain.xml保存到您要设置的bucket里面。
 
 
测试实例
通过该例子上传,可以选择多文件,上传有进度条。能上传大文件。
http://oss-demo.aliyuncs.com/oss-flash-upload-js-direct/index.html
 
 
实例分析
下面是对上传的协议抓包分析:
OSS Web直传——使用Flash上传
Flash上传时,第一次时会请求crossdomain.xml这个文件。然后再进行POST操作
 
其中请求crossdomain.xml的请求格式如下:
OSS Web直传——使用Flash上传
 
注意我框住的部分,请求是没有带任何签名的。
 
基于请求成功,OSS回复如下:
OSS Web直传——使用Flash上传
 
大家可能会有疑问,因为请求crossdomain.xml是没有带签名的,如果我的bucket是私有的,不带签名请求bucket里crossdomain.xml这个文件,肯定不成功,是不是意味着私有的bucket不支持flash上传。
这个答案当然是不管是私有的还是共有的bucket都是支持flash上传。

私有的bucket支持
上述问题的解决方法是通过Object Acl来实现。Object Acl可以参考文档:
 
ObjectAcl
ObjectAcl其实就是Object级别的权限管理。如我的bucket是私有的。但是我可以对于某一个文件设置一个其他权限。
在这里,我可以将crossdomain.xml这个object的object 权限设成公共读。即读这个私有bucket: post-test 里面的crossdomain.xml这个文件,不需要带签名也能读取。
 
如何设置object acl呢?
基于官方文档,我做了这样一个简单的demo 可以通过下面这个页面完成。
 http://oss-demo.aliyuncs.com/image/object-acl.html
 
 
设置的案例如下:
OSS Web直传——使用Flash上传
 
这个页面虽然填入你的id/key,但是往后端请求时,请求的签完名的串,所以后端没有办法知道你的id/key
所以你的id/key是安全,这个请放一百个心。
OSS Web直传——使用Flash上传
这个页面的原理是签名在前端js代码,因为有cors限制。js发送http request有限制。所以将js签名后的内容,发送到后端。由后端PHP程序,发送请求。并把结果返回。所以后端没有办法知道您所设置的id/key。 因为从签名后的内容是推算不出AccessId/AccessKey 。如上述图。
 
 
注意一点:因为本案例是签名在前端完成,有Accessid/AccessKey泄漏的风险。所以推荐签名在后端完成。可以参考例子:
 
 
http://oss-demo.aliyuncs.com/oss-flash-upload-js-php/index.html
 
 
代码下载:
签名在前端完成:点击下载
签名在PHP完成(推荐):点击下载
 
 
 
 
 
 
 
 
 
 
 
 

上一篇:Apache Thrift - 可伸缩的跨语言服务开发框架


下一篇:SpringBoot多数据源