我知道jQuery的Ajax方法不能处理下载,我不想添加一个jQuery插件来做这件事.

我想知道如何使用XMLHttpRequest发送POST数据来下载文件.

以下是我try 过的:

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

上面的代码有什么问题吗?我错过了什么吗?我只是不知道如何真正将数据作为下载发送到客户端.

推荐答案

UPDATE:自从引入Blob API以后,这个答案就不再准确了.详情请参阅史蒂文的答案.


ORIGINAL ANSWER:

XHR请求不会触发文件下载.我找不到明确的要求,但W3C doc on XMLHttpRequest也没有描述对Content-Disposition=附件响应的任何特殊react

如果不是POST请求,您可以在window.open()之前在单独的选项卡中下载该文件.Here有人建议使用target=_blank的隐藏形式

Django相关问答推荐

如何根据属性的 Select 对查询集进行排序

AttributeError:';ManyToOneRel&39;对象没有属性';attname';

如何在Django模板中为无效词典查找打开异常?

当使用django-tinymce时,我在哪里指定referer?

如何从基于类的视图将用户保存在 django 模型中

在不指定查找的情况下调用 prefetch_lated() 有用吗?

dj_rest_auth 中的 PyTest 警告- RemovedInDjango40Warning: django.conf.urls.url() 已弃用,取而代之的是 django.urls.re_path()

root urls.py 是 Django 中的 config/urls.py 吗?

如何在不编写每个视图中的逻辑的情况下呈现值,Django?

在 Django Rest Framework 视图中,request.user 是在请求​​到达视图之前进行数据库调用还是数据库调用发生?

Django 身份验证系统修改

ImportError:升级到 Django 4.0 后无法从 'django.conf.urls' 导入名称 'url'

Python 社区里的小马是怎么回事?

如何将我的上下文变量传递给 Django 中的 javascript 文件?

Django 国际化语言代码

settings.DATABASES 配置不正确使用 django 1.4 执行 syncdb 时出错

将 jQuery 脚本添加到 Django 管理界面

在 Django 中的字段中添加额外的约束

django.core.servers.basehttp.FileWrapper 在 Django 1.9 中消失

Django中'related_name'和'related_query_name'属性之间的区别?