我的网页有一个功能,允许用户请求生成相当大的json文件(3MB+(。生成过程需要一些时间,一旦准备好,我就会给他们发一封带有下载链接的电子邮件。
我的问题是,点击下载URL会在浏览器中打开json文件的内容,而不是启动下载对话框。
我发现了这个问题:提供要下载的.json文件,但解决方案将json文件保留到响应中:
mixed_query = list(invoices) + list(pcustomers)
json_str = serializers.serialize('json', mixed_query))
response = HttpResponse(json_str, content_type='application/json')
response['Content-Disposition'] = 'attachment; filename=export.json'
由于JSON文件已经存在,我不想在响应中完全重写它。我只想让用户下载已经生成的文件。
当到达URL时,我如何强制该URL开始下载?
我使用Django 3.1
,带有Python 3.6
以下是下载链接准备好后发送给用户的电子邮件模板:
{% extends "emails/email_css.html" %}
{% block mail_content %}
<p>Hi, {{ username }}</p>
<p>Your export for {{ export_name }} is ready!</p>
<p>The file will be available for download for 2 days, or until you request a new export.</p>
<a class="download_button" type="button" href={{ download_url }}>Download</a>
{% endblock %}
编辑:我还尝试了这个解决方案如何使用锚点标签下载文件<a>但是json文件仍然显示在浏览器中,而不是下载。
我最终找到了如何做到这一点,通过返回带有as_attachment=True
的FileResponse。
from django.http import FileResponse
def download_export(request):
response = FileResponse(open("path/to/file.json", 'rb'), as_attachment=True,
filename="file_name.json")
return response
尝试将download
属性添加到<a>
标记中。您可以选择是否指定下载文件名。
不带文件名:
<a class="download_button" type="button" href={{ download_url }} download>Download</a>
文件名:
<a class="download_button" type="button" href={{ download_url }} download="someJsonFile.json">Download</a>
有关download
属性,请参阅此处的文档。这里还有相关的StackOverflow帖子。