Python Django下载一个文件
我对使用Django非常陌生,我正在尝试开发一个网站,用户可以在其中上载许多excel文件,然后将这些文件存储在媒体文件夹Webproject/project/media中。Python Django下载一个文件,python,django,Python,Django,我对使用Django非常陌生,我正在尝试开发一个网站,用户可以在其中上载许多excel文件,然后将这些文件存储在媒体文件夹Webproject/project/media中。 def upload(request): if request.POST: form = FileForm(request.POST, request.FILES) if form.is_valid(): form.save() ret
def upload(request):
if request.POST:
form = FileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return render_to_response('project/upload_successful.html')
else:
form = FileForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('project/create.html', args)
然后,该文档将与他们上载的任何其他文档一起显示在列表中,您可以单击该列表,它将显示他们的基本信息以及他们上载的Excel文件的名称。从这里,我希望能够使用以下链接再次下载相同的excel文件:
<a href="/project/download"> Download Document </a>
您在参数文档根中缺少下划线。但在生产中使用
服务是个坏主意。改用类似的方式:
import os
from django.conf import settings
from django.http import HttpResponse, Http404
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/vnd.ms-excel")
response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
return response
raise Http404
我发现Django的FileField
非常有助于用户上传和下载文件。Django文档中有一节介绍。您可以在表中存储有关文件的一些信息,以及指向文件本身的FileField
。然后,您可以通过搜索表格列出可用的文件。您可以在标记中添加“下载”属性以下载文件
<a href="/project/download" download> Download Document </a>
像这样简单地使用html下载使用static关键字提到的文件
<a href="{% static 'bt.docx' %}" class="btn btn-secondary px-4 py-2 btn-sm">Download CV</a>
当您使用文件字段
上传文件时,该文件将具有一个URL,您可以使用该URL指向该文件,并使用HTML下载
属性下载该文件。您只需执行此操作即可
models.py
path('download_csv/', views.download_csv, name='download_csv'),
model.py看起来像这样
class CsvFile(models.Model):
csv_file = models.FileField(upload_to='documents')
views.py
path('download_csv/', views.download_csv, name='download_csv'),
#csv上传
class CsvUploadView(generic.CreateView):
model = CsvFile
fields = ['csv_file']
template_name = 'upload.html'
#csv下载
class CsvDownloadView(generic.ListView):
model = CsvFile
fields = ['csv_file']
template_name = 'download.html'
然后在你的模板中
#上载模板
upload.html
<div class="container">
<form action="#" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.media }}
{{ form.as_p }}
<button class="btn btn-primary btn-sm" type="submit">Upload</button>
</form>
{% for document in object_list %}
<a href="{{ document.csv_file.url }}" download class="btn btn-dark float-right">Download</a>
{% endfor %}
我没有使用表单,只使用渲染模型,但无论哪种方式,文件字段都在那里,它的工作原理相同。:
在view.py中,实现如下功能:
def download(request, id):
obj = your_model_name.objects.get(id=id)
filename = obj.model_attribute_name.path
response = FileResponse(open(filename, 'rb'))
return response
我使用这种方法:
{% if quote.myfile %}
<div class="">
<a role="button"
href="{{ quote.myfile.url }}"
download="{{ quote.myfile.url }}"
class="btn btn-light text-dark ml-0">
Download attachment
</a>
</div>
{% endif %}
{%if quote.myfile%}
{%endif%}
如果您在媒体中上传文件,则:
媒体
示例-input-file.txt
views.py
path('download_csv/', views.download_csv, name='download_csv'),
def下载\u csv(请求):
file\u path=os.path.join(settings.MEDIA\u ROOT,“example input file.txt”)
如果os.path.存在(文件路径):
打开(文件路径“rb”)作为fh:
response=HttpResponse(fh.read(),content_type=“application/vnd.ms excel”)
响应['Content-Disposition']='内联;filename='+os.path.basename(文件路径)
返回响应
url.py
path('download_csv/', views.download_csv, name='download_csv'),
download.html
<div class="container">
<form action="#" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.media }}
{{ form.as_p }}
<button class="btn btn-primary btn-sm" type="submit">Upload</button>
</form>
{% for document in object_list %}
<a href="{{ document.csv_file.url }}" download class="btn btn-dark float-right">Download</a>
{% endfor %}
a href=“{%url'下载\u csv%}”下载=“”
@Biswadp的解决方案对我来说非常有效
在静态文件夹中,确保包含希望用户下载的所需文件
在HTML模板中,代码应如下所示:
<a href="{% static 'Highlight.docx' %}"> Download </a>
1.settings.py:
MEDIA_DIR = os.path.join(BASE_DIR,'media')
#Media
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'
2.url.py:
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
3.在模板中:
<a href="{{ file.url }}" download>Download File.</a>
在django工作和测试>=3
有关更多详细信息,请使用此链接:
你能把服务
视图中的代码包括进去吗?效果很好。谢谢,这不允许用户使用路径
下载服务器上的任何文件吗?比如。/../some/other/path/secrets.txt
?@DonKirkby很可能,我从未使用过此代码。如果ROOT\u DIR不在os.path.abspath(os.path.join(ROOT\u DIR,path)),那么在URL中限制允许的符号或添加类似的内容是合理的:提升PermissionDenied
以查看。是否可以调整此方法以便用户下载.exe文件?例如,我迟到了,但是:path参数用于什么?我可以用这个下载一个powerpoint文件吗?该死的,这很容易实现,我想知道为什么这么少的投票!因为它对Django不起作用。Django将“/项目/下载”处理为URL。。。因此,如果/project/myfile.pdf
未解析为URL。。。GET请求将在Django中给出404-即使html标记为下载。您可以将其与Django一起使用:返回格式\u html(“”,value)它在djago@Hanny中对我有效您确定下载标记没有解决您的问题吗。也许你可以检查你的媒体根文件夹设置。这似乎比公认的答案好,谢谢!这对nginx是否也起作用?