之前有写过文章讲过http://bbs.aliyun.com/read/262307.html?spm=5176.bbsr258987.0.0.adua7x
有很多朋友私信我能否给出Flash上传的示例。
好的。今天我讲解一下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
实例分析
下面是对上传的协议抓包分析:
[attachment=89190]
Flash上传时,第一次时会请求crossdomain.xml这个文件。然后再进行POST操作
其中请求crossdomain.xml的请求格式如下:
[attachment=89192]
注意我框住的部分,请求是没有带任何签名的。
基于请求成功,OSS回复如下:
[attachment=89191]
大家可能会有疑问,因为请求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
设置的案例如下:
[attachment=89197]
这个页面虽然填入你的id/key,但是往后端请求时,请求的签完名的串,所以后端没有办法知道你的id/key
所以你的id/key是安全,这个请放一百个心。
[attachment=89206]
这个页面的原理是签名在前端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
代码下载:
签名在前端完成:[attachment=89207]
签名在PHP完成(推荐):[attachment=89208]
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。