2013-03-06 6 views
5

ich django bin mit den grundlegenden Web-Seiten zu entwerfen, die die uploading und downloading der Dateien zum/vom media Ordner behandeltHerunterladen die Dateien (die hochgeladen werden) von Medienordnern in django 1.4.3

Tatsächlich ist die Dateien werden erfolgreich in den Medien Ordner hochgeladen, auch werden die Dateien erfolgreich heruntergeladen, aber ein underscore wird dem datei_name als wie file_one.pdf_last charater angefügt, file_two.pdf_, file_three.txt_ usw.

Hier sind meine Codes

urls.py

urlpatterns = patterns('', 
      url(r'^upload$', 'learn_django.views.upload'), 
      url(r'^files_list$', 'learn_django.views.files_list'), 
      url(r'^download/(?P<file_name>.+)$', 'learn_django.views.download'), 
) 
if settings.DEBUG: 
    urlpatterns = patterns('', 
    url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), 
) + urlpatterns 

views.py

def upload(request): 
    ...... 
    .... 
    return render_to_response('uploads_form.html', {'form': form},context_instance=RequestContext(request)) 


def files_list(request): 
    return render_to_response('files_list.html',{'total_files':os.listdir(settings.MEDIA_ROOT),'path':settings.MEDIA_ROOT},context_instance=RequestContext(request)) 

def download(request,file_name): 
    file_path = settings.MEDIA_ROOT +'/'+ file_name 
    file_wrapper = FileWrapper(file(file_path,'rb')) 
    file_mimetype = mimetypes.guess_type(file_path) 
    response = HttpResponse(file_wrapper, content_type=file_mimetype) 
    response['X-Sendfile'] = file_path 
    response['Content-Length'] = os.stat(file_path).st_size 
    response['Content-Disposition'] = 'attachment; filename=%s/' % smart_str(file_name) 
    return response 

files_list.html

<table border="1" colspan="2" width="100%"> 
    <tr> 
    <th width="60%">File</td> 
    <th width="40%">Download</td> 
    </tr> 
{% for file in total_files %} 
    <tr> 
    <td width="60%">{{file}}</td> 
    <td width="40%" align="center"><a href="/download/{{file}}" style="text-decoration:None">Download here</a></td> 
    </tr> 
{% endfor %} 
</table> 

So in den oben genannten Codes, wenn eine Datei erfolgreich hochgeladen In den Medien wird es zuumgeleitetbis files_list Ansicht Funktionen, die die Gesamtzahl der Dateien in Form von Tabelle mit einem Download-Link neben jedem Dateinamen anzeigt.

Wenn wir also auf den Download-Anker-Link klicken, wird die entsprechende Datei durch Ausführen der Funktion download heruntergeladen.

So ist die Datei heruntergeladen wird erfolgreich, aber ein underscore_ zur letzten der Dateiname wird anhängt wie file_one.pdf_, file_two.pdf_, file_three.txt_ etc.,.

Also kann mir jemand bitte lassen Sie wissen, was in meinem obigen Download-Funktion Code falsch ist und warum underscore ist das Anhängen an den file name und wie diese underscore aus dem Dateinamen ...

Antwort

6

Nur / nach Dateinamen entfernen zu entfernen .

ändern diese:

response['Content-Disposition'] = 'attachment; filename=%s/' % smart_str(file_name) 

dazu:

response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name) 
3

Ihr Code ist richtig, aber es ist ein redundantes Zeichen in download:

def download(request,file_name): 
    file_path = settings.MEDIA_ROOT +'/'+ file_name 
    file_wrapper = FileWrapper(file(file_path,'rb')) 
    file_mimetype = mimetypes.guess_type(file_path) 
    response = HttpResponse(file_wrapper, content_type=file_mimetype) 
    response['X-Sendfile'] = file_path 
    response['Content-Length'] = os.stat(file_path).st_size 
    response['Content-Disposition'] = 'attachment; filename=%s/' % smart_str(file_name) 
    return response 

Endlich Zeile der Dateiname Attribut hat einen Schrägstrich (/): filename=%s/

Das verursacht das Problem. Entfernen Sie diesen Schrägstrich und es funktioniert.