Django下载文件

时间:2016-04-03 23:26:01

标签: python django

我是使用Django的新手,我正在尝试开发一个用户可以上传大量excel文件的网站,然后将这些文件存储在媒体文件夹中 Webproject / project /媒体。

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文件:

 <a  href="/project/download"> Download Document </a>

我的网址是

 urlpatterns = [

              url(r'^$', ListView.as_view(queryset=Post.objects.all().order_by("-date")[:25],
                                          template_name="project/project.html")),
              url(r'^(?P<pk>\d+)$', DetailView.as_view(model=Post, template_name="project/post.html")),
              url(r'^upload/$', upload),
              url(r'^download/(?P<path>.*)$', serve, {'document root': settings.MEDIA_ROOT}),

          ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

但是我收到了错误,serve()得到了一个意外的关键字参数&#39; document root&#39;。任何人都可以解释如何解决这个问题吗?

说明如何使用

选择和提供上传的文件
def download(request):
    file_name = #get the filename of desired excel file
    path_to_file = #get the path of desired excel file
    response = HttpResponse(mimetype='application/force-download')
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)
    response['X-Sendfile'] = smart_str(path_to_file)
    return response

10 个答案:

答案 0 :(得分:48)

您在参数文档 _ root中错过了下划线。但是在生产中使用serve是个坏主意。请改用这样的东西:

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

答案 1 :(得分:11)

Reference

在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

答案 2 :(得分:4)

您可以在代码内添加“下载”属性以下载文件。

<a  href="/project/download" download> Download Document </a>

https://www.w3schools.com/tags/att_a_download.asp

答案 3 :(得分:3)

我发现Django的FileField对于让用户上传和下载文件确实很有帮助。 Django文档的managing files部分。您可以将有关文件的某些信息以及指向文件本身的FileField存储在表中。然后,您可以通过搜索表格列出可用文件。

答案 4 :(得分:3)

使用FileField上传文件时,该文件将具有一个URL,可用于指向该文件并使用HTML download属性下载该文件,您只需执行此操作即可。 / p>

models.py

model.py看起来像这样

class CsvFile(models.Model):
    csv_file = models.FileField(upload_to='documents')

views.py

#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>

#download模板

download.html

  {% for document in object_list %}

     <a href="{{ document.csv_file.url }}" download  class="btn btn-dark float-right">Download</a>

  {% endfor %}

我没有使用表单,只是使用了呈现的模型,而是使用了 FileField 这两种方法,并且都可以使用。

答案 5 :(得分:1)

@Biswadp 的解决方案对我很有用

在您的静态文件夹中,确保有您希望用户下载的所需文件

在您的 HTML 模板中,您的代码应如下所示:

<a href="{% static 'Highlight.docx' %}"> Download </a>

答案 6 :(得分:0)

像这样简单地使用html下载使用静态关键字提到的文件

<a href="{% static 'bt.docx' %}" class="btn btn-secondary px-4 py-2 btn-sm">Download CV</a>

答案 7 :(得分:0)

我使用这种方法:

{% 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 %}

答案 8 :(得分:0)

如果您将文件上传到媒体中,则:

media
示例输入文件.txt

views.py

def download_csv(request):    
    file_path = os.path.join(settings.MEDIA_ROOT, 'example-input-file.txt')    
    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

urls.py

path('download_csv/', views.download_csv, name='download_csv'),

download.html

a href="{% url 'download_csv' %}" download=""

答案 9 :(得分:0)

1.settings.py:

MEDIA_DIR = os.path.join(BASE_DIR,'media')
#Media
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'

2.urls.py:

from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

3.in 模板:

<a href="{{ file.url }}" download>Download File.</a>

在 django 中工作和测试 >=3

有关更多详细信息,请使用此链接: https://youtu.be/MpDZ34mEJ5Y