2010-07-29 116 views
2

嘿,我无法用FileReference做文件上传。AS3文件上传IOError#2038

在独立运行swf时,上传工作正常。它将文件发送到远程服务器和本地主机(运行相同的应用程序)。但是当swf嵌入到firefox,chrome或safari时,我得到了IOError#2038。奇怪的是,它可以与IE8一起工作... 我也尝试从HTML表单上载文件,它可以工作(在每个浏览器上)。 crossdomain.xml被设置为完全访问的地方,但它永远不会被调用(它不应该反正......)

任何帮助非常感谢!

回答

3

我终于设法解决了这个问题。

问题出现是因为用户在执行上载操作之前必须登录。在使用FileReference对象执行上载操作时,Flashplayer不会发送浏览器存储的会话cookie,它具有类似于它自己的cookie空间的功能。你可以谷歌关于“Flash Cookie Bug”的更多信息。

这个bug已经被报告给Adobe:

不能发表,因为我代表的链接(附加HTTPS ://)...

我已经实现的解决方案(几乎与SWFUpload库解决此问题的方式几乎相同)是在执行上载时手动发送我的sessionid。

我发现这个链接非常有用,因为我使用的是Django后端。 http://blog.fogtunes.com/2009/11/howto-integrate-swfupload-with-django/

这个想法是,后端在执行登录后发送到flash应用程序的sessionid。然后,当Flash应用程序调用upload()方法时,应发送此sessionid(将其添加到URLVariables对象内的URLRequest数据属性中)。最后,当服务器收到请求时,它应该使用sessionid在处理上载操作之前正确设置活动会话。

var urlReq:URLRequest = new URLRequest("http://url-for-upload/"); 
urlReq.method = URLRequestMethod.POST; 
urlReq.data = new URLVariables(); 
urlReq.data.sessionid = sessionid_from_server; // this is a variable holding the sessionid received by the server after performing the login 
fileReference.upload(urlReq); 
1

对于如何使用相对路径,FileReference是比较奇怪的。在大多数情况下,基本路径是您的swf加载的路径。除了IE浏览器(或者其他方式,现在我不记得了)。我认为这不是IE/Firefox/chrmoe问题,而是一个玩家问题。 IE有一个Flash播放器,它使用ActiveX和其他浏览器的播放器。在某种程度上,他们在处理FileReference对象的相对路径方面存在分歧。如果这是一个功能,这是非常愚蠢的,所以我的感觉是这是一个错误,但没有检查错误的基础,所以我不知道它是否被官方认为是一个错误。另外,在嵌入代码中设置base_path不起作用。

无论如何,避免这种疯狂的唯一理智的方法是使用完整路径。试图检测是否IE浏览器可能会工作,但我认为在某些时候这种烦恼将被修复;当发生这种情况时,你的代码将会中断,所以我认为这是一个坏主意。

现在,您可能不想在swf中完整路径的硬编码,所以我用来解决此问题的一个简单解决方案(假设您可以更改嵌入代码)将此路径通过flash var当你嵌入你的瑞士法郎。一般来说,我用php检索这个路径,所以在部署时或者移动东西时我不必手动修改它(我将绝对路径传递给“app root”,对于我来说通常是嵌入swf;然后我将它连接到处理帖子的文件的相对路径,因此从swf开始,就像使用相对路径一样)。

所以,如果你可以使用一些服务器端,你可以只写一小段代码,并忘记它。但即使您手动执行此操作,重新编译swf也会更容易。

0

我遇到了这个确切的问题。问题是您的客户端无法访问您的应用程序......并且可能应用程序路径在客户端上是相对的。如果您完全符合客户端的要求,它可以与FF,Chrome和Safari一起使用。

由于某种原因,IE能够解决它,而其他浏览器则不能。但是,完全限定路径是最佳实践。任何人都可以解释IE如何解决它?