【问题标题】:Flash AS3 - URLLoader cant load binary data from different domainFlash AS3 - URL Loader 无法加载来自不同域的二进制数据
【发布时间】:2012-03-05 14:50:14
【问题描述】:

两个重点。 1 - SWF 必须能够从任何域加载二进制数据。 2 - SWF 无法从 url 加载策略 XML 文件,因为上传表单只允许我上传 swf 文件,所以我不能包含任何其他数据。 我试过了:

Security.allowDomain("*");

但它仅适用于 SWF 文件。 我尝试嵌入策略 XML 文件:

var dataXML:XML = 
<?xml version="1.0"?> 
<!-- http://www.foo.com/crossdomain.xml --> 
<cross-domain-policy> 
    <allow-access-from domain="*" /> 
</cross-domain-policy>;

但 Security.loadPolicyFile(url:String) 只允许设置文件 url,而不是数据。 所以我的问题是,我怎样才能允许 SWF 从不同的域加载二进制文件而无需任何额外的文件? URLLoader 代码:

var request:URLRequest = new URLRequest("http://differentdomain.com/binaryfile.dat");
var words:URLLoader = new URLLoader(); 
words.dataFormat = URLLoaderDataFormat.BINARY; 
words.addEventListener(Event.COMPLETE, prepareFile);
words.addEventListener(IOErrorEvent.IO_ERROR, loadError);
words.addEventListener(SecurityErrorEvent.SECURITY_ERROR, secureError);
words.load(request);

如果文件来自与 SWF 文件不同的域,这将导致安全错误。 感谢您的帮助。

可以在 AS3 代码中使用 ExternatInterface 从 JavaScript 获取二进制数据。 这是用于读取二进制文件的跨浏览器库:binary reader 和更高版本jDataView 希望这会对某人有所帮助。 感谢 Jonatan Hedborg 的想法。

【问题讨论】:

  • 要从 aaa.com 加载文件,您需要从 aaa.com/crossdomain.xml 加载 crossdomain.xml,否则可能无法正常工作。
  • 这对我来说似乎是个笑话。任何其他语言都允许从任何地方下载二进制数据,但 AS3 不允许?
  • 这是一个安全问题,它就是这样。解决它的唯一方法是设置一个代理服务器,您可以通过该代理服务器中继您的请求。另请注意,例如,silverlight 对跨域加载有更严格的限制,因此它不是唯一有这种怪癖的语言。
  • 如果我不能上传除 SWF 文件以外的任何内容,并且如果我希望我的 SWF 独立于外部服务器上的任何其他 php 脚本,则没有解决方案?我不明白 - 如果 linux 服务器上的 wget,php,任何下载软件或本地加载的 swf 都可以做到,为什么在域下运行 swf 不能。我们可以加载已知的闪存媒体文件,仅此而已。我花了很多时间在 Flash 技术中制作第一个 MIDI 播放器,它可以从粘贴的 url 播放 MIDI 和卡拉 OK 文件,现在它完全没用 - 我希望它独立于脚本/服务器。
  • 也许可以用 ExternalInterface 破解一些东西并通过 AJAX 加载文件,但大多数人只是设置了一个代理服务器来加载任意文件。您可能会为此获得一项服务,因此您不必设置自己的服务?我不确定您希望我们对此做什么 - 这是闪存的一项安全功能/限制,并且不太可能改变。

标签: actionscript-3


【解决方案1】:

您应该在此之前阅读此内容:http://kb2.adobe.com/cps/142/tn_14213.html

你可以使用代理脚本,在 google/stackoverflow 上搜索你会找到很多答案...

【讨论】:

  • 好的,我会读,但我希望你指的是 swf 中的脚本。我不想让它依赖于任何外部脚本/服务器。除了 SWF 文件,我也不能上传任何东西。否则我会让中介在同一个域上下载 php 文件。我不明白为什么程序员不能只在 swf 文件的代码中设置这个设置,而是必须使用代理技巧?无法嵌入此设置?
  • 你误会了,不是设置问题
【解决方案2】:

看看这个:http://wonderfl.net/c/gJXA

适用于任何域的任何二进制数据的一些技巧,无需使用 ajax 或自己的代理脚本(有时您无法上传 php 脚本)。

【讨论】:

  • 这里使用的是 Loader,而不是 URLLoader,所以我认为你不能访问二进制数据(例如,尝试将 URL 更改为图像 URL)
  • @Penx 您可以在此脚本中使用 URLLoader 并获取二进制数据。一天就试试吧。但我认为有大约 2 MB 的大小限制?或者可能是我从执行限制中获取数据的服务器,我不确定......
【解决方案3】:

Flash 是 HTML 页面最常用的控件。因此,它需要遵循同一页面上其他(即 JavaScript)对象的安全限制。 网页使用same origin 安全策略 - 页面上的对象无法从与当前页面的域不同的域中读取数据。

在某些情况下,其他域的服务器允许此类访问。 IE。在 Flash 的情况下,它是 crossdomain.xml,Silverlight 存在类似的策略文件,有几种方法可以用于 JavaScript,包括 JSONP

不正确地使用绕过同源策略的方法会导致托管您的控件的网站/页面上出现cross-site scripting 问题,这通常会导致个人信息泄露。

【讨论】:

    【解决方案4】:

    前段时间我不得不解决一个类似的问题,并设法利用UrlStream 在运行时加载目标 SWF 的字节。

    要点:https://gist.github.com/1988661

    【讨论】:

    • 我正在寻找加载任何二进制数据。我测试了你的脚本,但在我的情况下它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2011-06-30
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多