2013-03-06 2 views
5

Я использую Django для разработки основных веб-страниц, который обрабатывает uploading и downloading файлов в/из media папкиЗагрузка файлов (которые загружены) из папки мультимедиа в Джанго 1.4.3

На самом деле файлы успешно загружены в папку медиа, а также файлы загружаются успешно но underscore добавляются к имя_файлу как last charater как file_one.pdf_, file_two.pdf_, file_three.txt_ и т.д.,

Ниже приведены мои коды

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> 

Таким образом, в приведенных выше кодов, когда файл успешно загружен в медиа, он будет перенаправлен на files_list.html через files_list просмотр функций, отображающих общее количество файлов в виде таблицы с ссылкой для загрузки рядом с каждым именем файла.

Поэтому, когда мы нажимаем на ссылку привязки загрузки, соответствующий файл будет загружен путем выполнения функции download.

Так файл загружается успешно, но underscore_ является добавление к последней из имени файла, как file_one.pdf_, file_two.pdf_, file_three.txt_ и др.,.

Так может кто-нибудь пожалуйста, дайте мне знать, что случилось в моей выше загрузки кода функции и почему underscore является добавление к file name и как удалить этот underscore из имени файла ...

ответ

6

Просто удалите / после имени файла ,

Изменить это:

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

к этому:

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

Ваш код правильный, но есть один избыточный характер в 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 

В последней строке атрибут файла имеет концевую косую черту (/): filename=%s/

В чем причина проблемы. Удалите эту косую черту, и она работает.