我的JavaScript应用程序需要在使用Ajax 下载资源之前确定资源的长度。通常这不是问题,您只需发出HEAD请求并提取Content-Length
。
var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// "2195"
但是,资源存储在客户端的不同服务器上。 (我控制的服务器)。所以我使用CORS来制作跨域ajax请求,并设置服务器以响应HEAD请求的预检请求和带有自定义标头的GET / POST请求。
这在主要方面工作得很好,但在使用CORS时,我似乎找不到从HEAD响应中提取Content-Length
的方法:
var xhr = $.ajax({type:"HEAD", url: "http://other-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// ERROR: Refused to get unsafe header "Content-Length"
我已经在预检或响应中设置了各种标题,例如
Access-Control-Expose-Headers: Content-Length
规范似乎建议的应该使它可用。但无论我做什么,我似乎都无法向客户端提供Content-Length标头。有什么建议吗?
(Chrome 8)
答案 0 :(得分:5)
我遇到了同样的问题,直到我在其他地方发现了一个线程,教我在.htaccess上添加这一行:
Header add Access-Control-Expose-Headers "Content-Length"
然后BOOM,它得到了解决。
答案 1 :(得分:3)
我发现所有浏览器中的CORS响应头支持都是错误的。在Chrome / Safari中,我只在getAllResponseHeaders()的结果中看到简单的响应标头(http://www.w3.org/TR/cors/#terminology),即使在“Access-Control-Expose-Headers”标头中也是如此在响应中设置。在Firefox 3.6.13中,getAllResponseHeaders()不返回任何内容(甚至不是简单的响应头)。作为一种解决方法,我想你可以重载一个简单的响应头来包含内容长度,但这可能会导致其他问题,但仍然无法修复Firefox。