我正在构建一个Flex应用程序,用户可以在其中输入互联网上图像的URL,然后让flash加载URL指向的图像。这对于没有特殊字符的URL来说很好(通过设置source
属性或在Image
上调用load()
)。但是,当提交的URL中有已经转义的特殊字符时,即在大多数情况下,直接从浏览器中的URL栏复制,URLRequest
会再次用"%25"转义百分号,这会使URL无效,服务器会返回错误。在浏览器中粘贴相同的URL可以很好地加载图像。我在URL上尝试过decodeURI()
,但它忽略了一大组字符,所以我尝试了decodeURIComponent()
,它可以正确地解码所有内容,但当URLRequest
对其进行重新编码时,它会忽略现在解码的特殊字符,并且不会转义它们,所以在这种情况下,URL是无效的,因为它中仍然有不安全的字符,并且会失败。那么,我如何向URLRequest
发送包含特殊字符(编码或未编码)的内容,并使其实际工作呢?真的,我希望它没有对我的URL做任何事情,让我确定它是否有效,但它嵌入在Flash Player全局swc中,因此是Flash的封闭源代码,我看不到源代码。如有任何帮助,我们将不胜感激!
这基本上就是我正在做的:
var image:Image = new Image();
image.source = textInput.text;
我一直在测试的URL来自盖蒂图片社:
http://cache2.asset-cache.net/gc/sb10064464f-001-dog-looking-up-close-up-gettyimages.jpg?v=1&c=IWSA资产&k=2&d=BRDT%2birX5%2bLh54FjE4ekKh%2bjEirx6jSgMBJOgVxvtKL5ngFuzD9P5u%2bPvlXK4QAMaEHcwY6NrdJUQFip1%2fKXAA%3d%3d
如果您在SWFLoader
(Image
扩展的)中的loadContent()
函数中逐步执行代码,在从new URLRequest
创建requestedURL
之后,URLRequest
对象上的url
属性的所有百分号(再次)都用"%25"转义,生成以下URL(这将从Getty返回500错误):
http://cache2.asset-cache.net/gc/sb10064464f-001-dog-looking-up-close-up-gettyimages.jpg?v=1&c=IWSA资产&k=2&d=BRDT%252firX5%252bLh54FjE4ekKh%252bjEirx6jSgMBJOgVxvtKL5ngFuzD9P5u%252bPvlXK4QAMaEHcwY6NrdJUQFip1%252fKXAA%253d%253d
更新
- 我忘了提到我正在运行Flex SDK 4.1,
Image
是mx.controls.Image
- 根据wvxvw的建议,我尝试了
unescape()
,结果与使用decodeURIComponent()
相同 - 在用
decodeURIComponent()
解码后,我还尝试在URL上调用encodeURI()
,但它当然会忽略解码后的URL中的许多不安全字符,并且不会对它们进行重新编码。URLRequest
也这样做,所以最后调用的URL没有编码,因此失败 - 有趣的是,当我尝试在URL上调用
encodeURIComponent()
并在传入之前对其进行重新编码时,URLRequest
没有对百分比进行重新编码,可能是因为它们已经是"%25"了 - 最后,它似乎只寻找"%"符号,并简单地用"%25"替换它们(如果它们后面还没有"25"),然后忽略其他不安全的字符。它为什么要这么做?为什么以前没有其他人遇到过这个问题
对于从具有潜在不安全字符的URL加载的图像,必须使用Loader
或URLLoader
并手动加载,这样可以避免使用SWFLoader
和OSToPlayerURI()
函数。