2011-11-08 64 views
0

我有一個代理上傳一個火災到亞馬遜S3服務器。此代理使用NodeJS完成,我的網頁託管在Tomcat服務器上。因此,爲了進行Xhr上傳,我必須使用Nginx來解決跨域問題,因爲兩臺服務器都在同一臺機器上。Xhr上傳支持跨域請求

但是使用Nginx有很多問題,所以我的老闆問我是否可以使用跨域策略來做同樣的事情。我做到了,但那是我無法做到的一些事情。這裏是我的代碼:

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(e) {}; 
xhr.open('POST', self.basePath + '/upload' + file.name, true, null, null, null, true,  true); 
xhr.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01"); 
xhr.setRequestHeader("Connection", "close"); 
xhr.sendAsBinary(file.getAsBinary()); 

這個工作在一個跨域請求到達與文件服務器和返回響應,但是當我嘗試設置這樣的進度事件:

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(e) {}; 
xhr.upload.onprogress = function(){console.info('on progress');}; 
xhr.open('POST', self.basePath + '/upload' + file.name, true, null, null, null, true,  true); 
xhr.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01"); 
xhr.setRequestHeader("Connection", "close"); 
xhr.sendAsBinary(file.getAsBinary()); 

的跨域請求未被觸發(請求使用「OPTIONS」方法而不是POST,並且它永遠不會到達服務器)。但是,正如您可能認爲的那樣,我需要進度事件才能將其展示給用戶。有誰知道發生了什麼?

Ps:上述所有代碼完全適用於「同一域名」請求。 Ps2:我試過xhr.onprogress,但它永遠不會被解僱(在交叉或相同的域請求) Ps3:我​​試過FF4 +和Chrome 12+

謝謝你很多。 Thiago

回答

1

我以前遇到過類似的問題。

解決方案:添加

<AllowedHeader>*</AllowedHeader> 
在CORS配置

在S3上

1
xhr.upload.addEventListener("progress", yourUpdateProgressFunction, false);