强制下载现有的JSON文件,而不是将其与Django一起显示



我的网页有一个功能,允许用户请求生成相当大的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帖子。

相关内容

最新更新