如何从跨域 Ajax 请求访问 Content-Length 标头?

How can I access the Content-Length header from a cross domain Ajax request?(如何从跨域 Ajax 请求访问 Content-Length 标头?)
本文介绍了如何从跨域 Ajax 请求访问 Content-Length 标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 JavaScript 应用程序需要在使用 Ajax 下载资源之前确定资源的长度.通常这不是问题,您只需发出 HEAD 请求并提取 Content-Length.

My JavaScript application needs to determine the length of a resource before downloading it with Ajax. Ordinarily this is not a problem, you just make a HEAD request and extract the Content-Length.

var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"})
xhr.getResponseHeader("Content-Length")  
// "2195"

但是,资源存储在与客户端不同的服务器上.(我控制的服务器).所以我使用 CORS 来发出跨域 ajax 请求,并设置服务器来响应 HEAD 请求的预检请求和带有自定义标头的 GET/POST 请求.

However, the resources are stored on a different server to the client. (A server I control). So I'm using CORS to make cross domain ajax requests, and have set up the server to respond to preflighting requests for HEAD requests and GET/POST requests with custom headers.

这在主要方面工作得很好,但在使用 CORS 时,我似乎找不到从 HEAD 响应中提取 Content-Length 的方法:

That is working great in the main, but I can't seem to find a way extract the Content-Length from the HEAD response when working with CORS:

var xhr = $.ajax({type:"HEAD", url: "http://other-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// ERROR: Refused to get unsafe header "Content-Length"

我已经尝试在预检或响应中设置各种标头,例如

I have experimented with setting various headers in the preflighting or in the response, such as

Access-Control-Expose-Headers: Content-Length

规范似乎建议应该使其可用.但无论我做什么,我似乎都无法使 Content-Length 标头对客户端可用.有什么建议吗?

which the specification seems to suggest should make it available. But no matter what I do, I can't seem to make the Content-Length header available to the client. Any suggestions?

(铬 8)

推荐答案

我发现所有浏览器对 CORS 响应标头的支持都存在问题.在 Chrome/Safari 中,我只在 getAllResponseHeaders() 的结果中看到简单的响应标头 (http://www.w3.org/TR/cors/#terminology),即使是Access-Control-Expose-Headers"标头在响应中设置.在 Firefox 3.6.13 中, getAllResponseHeaders() 不返回任何内容(甚至不返回简单的响应标头).作为一种解决方法,我想您可以重载一个简单的响应标头以包含内容长度,但这可能会导致其他问题,并且仍然无法修复 Firefox.

I've found CORS response header support in all browsers to be buggy. In Chrome/Safari, I only see simple response headers (http://www.w3.org/TR/cors/#terminology) in the result of getAllResponseHeaders(), even when the "Access-Control-Expose-Headers" header is set in the response. And in Firefox 3.6.13, getAllResponseHeaders() doesn't return anything (not even simple response headers). As a workaround, I suppose you could overload one of the simple response headers to include the content-length, but that may cause other issues, and still wouldn't fix Firefox.

这篇关于如何从跨域 Ajax 请求访问 Content-Length 标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)