python - Django एक फ़ाइल डाउनलोड करें




(2)

मैं Django का उपयोग करने के लिए काफी नया हूं और मैं एक वेबसाइट विकसित करने की कोशिश कर रहा हूं जहां उपयोगकर्ता कई एक्सेल फाइल अपलोड करने में सक्षम है, ये फाइलें तब मीडिया फ़ोल्डर Webproject / प्रोजेक्ट / मीडिया में संग्रहीत की जाती हैं

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)

फिर दस्तावेज़ को उनके द्वारा अपलोड किए गए किसी भी अन्य दस्तावेज़ के साथ एक सूची में प्रदर्शित किया जाता है, जिसे आप क्लिक कर सकते हैं और यह उनके बारे में बुनियादी जानकारी और उनके द्वारा अपलोड किए गए एक्सफ़ाइल के नाम को प्रदर्शित करेगा। यहां से मैं लिंक का उपयोग करके फिर से उसी एक्सेल फाइल को डाउनलोड करने में सक्षम होना चाहता हूं:

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

लेकिन मुझे त्रुटि मिलती है, सेवा () को एक अप्रत्याशित कीवर्ड तर्क 'दस्तावेज़ रूट' मिला। किसी को कैसे यह तय करने के लिए समझा सकता हूँ?

या

बताएं कि मैं अपलोड की गई फ़ाइलों को कैसे चुन सकता हूं और उपयोग करके सेवा कर सकता हूं

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

आप फ़ाइलों को डाउनलोड करने के लिए अपने टैग के अंदर "डाउनलोड" विशेषता जोड़ सकते हैं।

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

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


आपने तर्क दस्तावेज़ _ रूट में अंडरस्कोर को याद किया। लेकिन उत्पादन में 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




django