2011-11-08 65 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);