2013-03-06 5 views
5

Używam Django zaprojektować podstawowe stron internetowych, który obsługuje uploading i downloading plików do/z folderuPobieranie plików (które są załadowane) z folderu mediów w Django 1.4.3

Właściwie media pliki są pomyślnie przesłany do folderu mediów, a także pliki pobierane są z powodzeniem ale underscore jest dołączany do nazwa_pliku jako last charater jak file_one.pdf_, file_two.pdf_, file_three.txt_ itp

poniżej są moje kody

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> 

Więc w powyższych kodów, kiedy plik został pomyślnie przesłany w mediach zostanie przekierowany na numer files_list.html do files_list wyświetla funkcje, które wyświetlają całkowitą liczbę plików w formie tabeli z linkiem pobierania obok nazwy każdego pliku.

Po kliknięciu linku pobierania pobierania zostanie pobrany odpowiedni plik, wykonując funkcję download.

Więc plik jest pobieranie z powodzeniem, ale underscore_ jest dołączenie do ostatniej nazwy pliku jak file_one.pdf_, file_two.pdf_, file_three.txt_ itp.,.

Więc może ktoś proszę dać mi znać, co się dzieje w moim powyższym kodzie funkcję pobierania i dlaczego underscore jest dołączenie do file name i jak usunąć ten underscore od nazwy pliku ...

Odpowiedz

6

Wystarczy usunąć / po nazwie pliku .

Zmień to:

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

do tego:

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

Twój kod ma rację, ale jest jeden nadmiarowy znak w 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 

W ostatnim wierszu atrybut nazwy pliku ma końcowe ukośniki (/): filename=%s/

Co powoduje problem. Usuń ten ukośnik i działa.

Powiązane problemy