Проблема Django с загрузкой файла с моего компьютера
Я новичок в Django и мне нужна помощь. Я хочу скачать файл, путь к которому находится в plik.localisation (он был взят из цикла). Проблема заключается в пути. Может ли кто-нибудь помочь мне, что я делаю не так? Мой view.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/(?P<path>)$', serve,{'document root': path}, name="download"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Html
<div class="com">
{{plik.localisation}} <a href="{% url download/path %}" class="button">downloadz</a>
</div>
Я пытался изменить этот путь, но все еще испытываю проблемы с ним.
В вашем urlpatterns
отсутствует path()
с name
'download/path'
, поэтому при нажатии на этот тег анкора вы получите 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] The Content-Type
header is automatically set when it can be guessed from the filename
, or the name of open_file
so no need for "application/pdf"
.
[2] as_attachment
is False
by default. Content-Disposition: inline
will now be the header set.
Этот код работает
def download(request, path): with open(path, 'rb') as fh: if os.path.exists(path): return FileResponse(open(path, 'rb'), as_attachment=True, filename=os.path.basename(path)) raise Http404