使用 as3httpclient 套接字闪存上传到 s3
Posted
技术标签:
【中文标题】使用 as3httpclient 套接字闪存上传到 s3【英文标题】:flash upload to s3 using as3httpclient socket 【发布时间】:2011-12-21 07:22:50 【问题描述】:我正在尝试使用套接字将 jpeg 从闪存上传到 Amazon S3,我想避免 URLLoader 和 FileRefrence 上传其他需要用户交互的安全策略问题。我希望能够调整图像大小并将其编码为 ByteArray 并根据外部接口调用上传图像。我看到了这个例子。
https://github.com/gabriel/as3httpclient/blob/master/test/s3/S3PostTest.as
我使用了下面的crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.example.com -->
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" secure="false"/>
</cross-domain-policy>
我得到了口头禅
错误:来自http://mybucket.s3.amazonaws.com/swf/myswf.swf 的请求者对 xmlsocket://mybucket.s3.amazonaws.com:80 的资源请求因缺少策略文件权限而被拒绝。
我知道这使用了套接字实现,但我不知道此时我缺少什么,S3 是否不允许您通过端口 80 或 443 从闪存套接字实现中查找策略文件?但是它不能解释为什么这个 as3httpclient 示例在那里,有人有什么想法吗?
【问题讨论】:
【参考方案1】:我认为答案是 Amazon S3 的 as3httpclient 代码是用于 Adobe Air 而不是 Flash/Flex。
通过 http 检查套接字策略文件对我不起作用,因为 flash 仍然需要通过端口 80 上的套接字检查它失败(即使它通过 http 被接受)。
【讨论】:
我有同样的问题,并开始得出同样的结论【参考方案2】:如果你想使用套接字(as3httpclient 使用套接字处理 HTTP 事务),你需要一个 crossdomain 策略文件。
它必须由与您的套接字目标点相同的服务器(此处为 http://mybucket.s3.amazonaws.com)提供服务。
有两种方法可以做到这一点:通过 843 端口(XMLSocket 事务)提供服务,或者通过 HTTP 提供服务,例如:http://mybucket.s3.amazonaws.com/crossdomain.xml 并在任何 HTTP 事务之前在您的应用程序中调用 Security.loadPolicyFile("http://mybucket.s3.amazonaws.com/crossdomain.xml");
。
参考资料:
http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html【讨论】:
我正在这样做 好的:已接受策略文件:mybucket.s3.amazonaws.com/crossdomain.xml,我的理解是,当您实例化套接字时,Flash 播放器现在会查找 xmlsocket://mybucket.s3.amazonaws.com: 80,这发生在我发出 POST 调用之后,当它在 S3 上被拒绝时。【参考方案3】:它不起作用,因为除了跨域策略文件之外,服务器(在您的情况下为 S3)必须允许您通过Socket Policy File Server 成功地与它建立套接字连接。而 S3 显然没有运行它。
只有 Web 应用程序(Flash/Flex)需要它,桌面应用程序(AIR 等)可以在没有 Socket Policy File Server 批准的情况下通过。
【讨论】:
以上是关于使用 as3httpclient 套接字闪存上传到 s3的主要内容,如果未能解决你的问题,请参考以下文章