gpt4 book ai didi

javascript - 使用 XMLHttpRequest 提示文件下载

转载 作者:行者123 更新时间:2023-12-02 22:50:16 26 4
gpt4 key购买 nike

我知道 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 表单,因为表单数据相当大,并且是动态创建的。

上面的代码有问题吗?我缺少什么吗?我只是不知道如何实际将数据作为下载发送到客户端。

最佳答案

如果在发送请求之前将 XMLHttpRequest.responseType 属性设置为 'blob',那么当您收到响应时,它将表示为 blob。然后,您可以将该 blob 保存到临时文件并导航到该文件。

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 = 'blob';
xhr.onload = function (e) {
var blob = e.currentTarget.response;
var contentDispo = e.currentTarget.getResponseHeader('Content-Disposition');
// https://stackoverflow.com/a/23054920/
var fileName = contentDispo.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)[1];
saveOrOpenBlob(blob, fileName);
}
xhr.send(postData);

下面是 saveOrOpenBlob 的示例实现:

function saveOrOpenBlob(blob, fileName) {
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.TEMPORARY, 1024 * 1024, function (fs) {
fs.root.getFile(fileName, { create: true }, function (fileEntry) {
fileEntry.createWriter(function (fileWriter) {
fileWriter.addEventListener("writeend", function () {
window.location = fileEntry.toURL();
}, false);
fileWriter.write(blob, "_blank");
}, function () { });
}, function () { });
}, function () { });
}

如果您不关心浏览器是否导航到可查看文件类型的文件,那么创建一个始终直接保存到文件的方法会简单得多:

function saveBlob(blob, fileName) {
var a = document.createElement('a');
a.href = window.URL.createObjectURL(blob);
a.download = fileName;
a.dispatchEvent(new MouseEvent('click'));
}

关于javascript - 使用 XMLHttpRequest 提示文件下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22724070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com