2010-07-29 51 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如何解決它?