【发布时间】:2014-05-08 13:52:45
【问题描述】:
我知道 jQuery 的 ajax 方法无法处理下载,我不想添加 jQuery 插件来执行此操作。
我想知道如何使用 XMLHttpRequest 发送 POST 数据来下载文件。
这是我尝试过的:
var postData = new FormData();
postData.append('cells', JSON.stringify(output));
var xhr = new XMLHttpRequest();
xhr.open('POST', '/export/', true);
xhr.setRequestHeader("X-CSRFToken", csrftoken);
xhr.responseType = 'arraybuffer';
xhr.onload = function (e) {
console.log(e);
console.log(xhr);
}
xhr.send(postData);
我正在使用 Django,并且文件似乎已成功发送回客户端。在 Chrome 的网络选项卡中,我可以在预览选项卡中看到乱码(这是我所期望的)。但我想发回一个 zip 文件,而不是 zip 文件的文本表示。这是 Django 后端:
wrapper = FileWrapper(tmp_file)
response = HttpResponse(wrapper, content_type='application/zip')
response['Content-Disposition'] = "attachment; filename=export.zip"
response['Content-Length'] = tmp_file.tell()
return response
我已经搜索了好几个小时,但没有找到关于如何使用 XMLHttpRequests 执行此操作的适当示例。我不想使用 POST 操作创建正确的 html 表单,因为表单数据相当大,并且是动态创建的。
上面的代码有问题吗?我错过了什么?我只是不知道如何实际将数据作为下载发送到客户端。
【问题讨论】:
-
我没有发现任何问题。如果您更改视图以响应 GET 请求返回文件并在浏览器中打开 URL,它是否按预期下载文件?
-
是的,它会下载@Marat。我只需使用带有“/export/”操作的普通html表单就可以下载它,并且我得到了xhr的响应,但它只是不会触发下载。是不是xhr不能下载到客户端?
-
你能不接受我的回答而接受史蒂文的回答吗?把过时的放在上面真的很令人困惑
标签: javascript django post xmlhttprequest