我看了很多相同的问题,但没有一个解决我的问题, 我正在尝试使用按钮下载在我的视图中生成的文件。 问题:单击“下载”按钮时收到空文件
我的观点:
class dumpView(View):
template_name = 'download.html'
def get(self, request):
file = open("/home/test.pdf", "rwbt")
response = HttpResponse(file.read(), content_type="application/pdf")
response['Content-Disposition'] = 'attachement; filename=%s' % file
return render(request, 'download.html')
我的url:
url(r'^dump/', dumpView.as_view()),
我的模板:
{% extends 'base.html' %}
{% load staticfiles %}
{% block content %}
<div class="container">
<div class="row">
<div class="jumbotron">
<div class="row">
<center>
<a href="javascript:void(0)" class="btn btn-primary btn-lg dump">Download</a>
</center>
</div>
</div>
</div>
</div>
{% endblock %}
{% block javascript %}
<script src="{% static 'js/home.js' %}"></script>
{% endblock %}
我的Django视图正在呈现响应。我确实在UI中的带有类dump的按钮上添加了一个点击处理程序,以向“/dump”URL发出XHR请求,并以blob的形式接收响应,并下载具有自定义名称和日期的文件。
我的js:
$(".dump").on("click", function() {
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
var a, today;
if (xhttp.readyState === 4 && xhttp.status === 200) {
a = document.createElement('a');
a.href = window.URL.createObjectURL(xhttp.response);
today = new Date();
a.download = "file_" + today.toDateString().split(" ").join("_") + ".pdf";
a.style.display = 'none';
document.body.appendChild(a);
return a.click();
}
};
xhttp.open("GET", "/dump", true);
xhttp.setRequestHeader("Content-Type", "application/json");
xhttp.responseType = 'blob';
xhttp.send();
});
在您的视图中,您将
Content-Disposition
设置为attachment; filename=...
,但要附加file对象。我猜浏览器可能需要一个文件名,最好是正确的扩展名。我在Django项目中有一个类似的视图,我也引用了文件名,但是我不确定是否有必要
编辑:另外,“附件”中还有一个拼写错误,去掉多余的“e”看看是否有帮助
在你看来,我建议在你的回答中增加一个大小
正如@bob vork刚才所说,来自
Content-Disposition
的文件名不应该是pythonfile
对象,而是您下载的文件名。如何在urls.py中注册视图,然后将javascript替换为:
编辑:
既然您要使用建议的HTML,那么我将为我的解决方案提供更多细节。
首先,可以删除
home.js
。正如你所理解的变成
你的
views.py
应该直接返回response
也要注意正确的内容类型。注意,我没有测试视图(特别是文件包装器),我修改了一些纯文本代码。这也是将pdf作为文本文件处理时出现TypeError的原因。
在url.py中
相关问题 更多 >
编程相关推荐