Django 从我的计算机下载文件时出现问题

问题描述 投票:0回答:1

我是 Django 新手,我需要一些帮助。我想下载路径为

plik.localisation
的文件(它是从循环中获取的)。问题出在路径上。有人可以帮助我吗?我做错了什么?

我的观点.py是:

def download(request, path):
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="application/pdf")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response
    raise Http404

网址

    path('download/<str:path>',views.download, serve, name="download"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

HTML

<div class="com">
       {{plik.localisation}} <a href="{% url 'download/path' %}" class="button">download</a>
</div>

我尝试更改该路径,但仍然存在问题。

django view download
1个回答
0
投票

您的

path()
中没有
name
'download/path'
urlpatterns
,因此当您单击该锚标记时,您将获得 404 HTTP 响应状态。

你想要的是:

<div class="com">
    <a href="{% url 'download' plik.localisation %}" class="button">download</a>
</div>

旁白

您想将文件显示为网页的一部分吗(考虑到您正在使用标题

Content-Disposition: inline
)?如果是这样,为什么要给锚标记添加
"download"
的文本?如果它是由客户端下载的,那么服务器代码应该是这样的:

#•••Rest of code•••
if os.path.exists(file_path):
    return FileResponse(open(file_path, 'rb'), as_attachment=True, filename=os.path.basename(file_path)) #[1]

如果文件要作为网页的一部分显示,则锚标记的文本不应为

"download"
。这是误导。它可能应该是
"view"
"open"
或同一消息的任何其他变体,因为它不会被下载。那么你的代码将是:

#•••Rest of code•••
if os.path.exists(file_path):
    return FileResponse(open(file_path, 'rb'), filename=os.path.basename(file_path))[2]

[1] 当可以从

Content-Type
filename
的名称猜测时,会自动设置
open_file
标头,因此不需要
"application/pdf"

[2]

as_attachment
默认为
False
Content-Disposition: inline
现在将成为标题集。

© www.soinside.com 2019 - 2024. All rights reserved.