在我的Apache Web服务器配置中,我添加了对两个不属于标准六的标头的支持:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Expose-Headers: Content-Disposition,X-Filename
我的文件导出CGI脚本打印包含这两个字段数据的标题,例如:
...
print "Content-Disposition: attachment; filename=%s\n" % (out_fn)
print "X-Filename: %s\n" % (out_fn)
...
我的客户端AJAX调用尝试在成功的AJAX请求中检索Content-Disposition
的值:
var export_form = new FormData();
export_form.append("settings", JSON.stringify(settings));
export_form.append("format", format);
$.ajax({
url: "services/export_data.py",
type: "POST",
async: true,
cache: false,
data: export_form,
processData: false,
contentType: false,
success: function(response, textStatus, jqXHR) {
console.log("success");
console.log(jqXHR.getAllResponseHeaders());
console.log(jqXHR.getResponseHeader('Content-Disposition'));
},
error: function(jqXHR, textStatus, errorThrown) {
console.log("export_form submit failed:", jqXHR.status, jqXHR.statusText);
console.log(jqXHR);
}
});
我在客户端的测试请求完成并运行success
回调,然后我在response
字段中返回文件数据,但我得到null
的响应标头{ {1}}。
换句话说,Content-Disposition
的样本结果是:
console.log(jqXHR.getAllResponseHeaders())
Date: Sat, 04 Mar 2017 19:42:27 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_python/3.5.0- Python/2.7.5 mod_perl/2.0.10 Perl/v5.16.3
Transfer-Encoding: chunked
Content-Type: application/pdf
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Content-Disposition,X-Filename
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
的结果为空:
console.log(jqXHR.getResponseHeader('Content-Disposition'))
为什么我的AJAX请求无法检索null
的值,当我通过Web服务器配置明确提供它时,我已在响应中正确设置它?
为了解决换行问题,我使用Content-Disposition
来更好地控制输出,例如:
sys.stdout.write
不幸的是,通过sys.stdout.write("Content-Type: %s\n" % (mime_type))
sys.stdout.write("Content-Disposition: attachment; filename=%s\n" % (output_fn))
sys.stdout.write("X-Filename: %s\n" % (output_fn))
sys.stdout.write("Content-Description: File to download\n\n")
with open(out_fn, "rb") as out_fh:
sys.stdout.write(out_fh.read())
和console.log(jqXHR.getResponseHeader('Content-Disposition'))
,这两个标头仍然无法通过console.log(jqXHR.getResponseHeader('X-Filename'))
显示在AJAX响应中。
答案 0 :(得分:0)
Access-Control-Expose-Headers
仅适用于CORS请求:您的案例中的Content-Disposition
和X-Filename
会添加到六个标准标头中,如果它从您的服务器请求数据,则允许其他域查看。
您发送的请求看起来不像是跨域的:网址services/export_data.py
不指向其他域,console.log(jqXHR.getAllResponseHeaders())
的输出包含{{1}这样的标题不在六个标准和两个公开标题中的}或Server
。
我认为您的问题是服务器端,而不是Javascript,并且您实际上并没有发送要包含的两个标头。
CGI脚本似乎是用Python编写的(基于URL中的文件扩展名)。如果是这种情况Date
实际上打印了两个换行符,并且由于空行界定了HTTP中的标题和数据,您添加的两个标题将包含在HTTP响应中,但被视为数据而不是标题。在添加print "\n"
之前是否有print
声明?这可以解释为什么它也没有显示为标题。
要解决此问题,只需删除脚本中的尾随Content-Disposition
:
\n