Python Django下载一个文件

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

我对使用Django非常陌生,我正在尝试开发一个网站,用户可以在其中上载许多excel文件,然后将这些文件存储在媒体文件夹Webproject/project/media中。

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是否也起作用?