我正在使用django来设计处理uploading
文件夹中downloading
和media
文件的基本网页
实际上文件已成功上传到媒体文件夹,文件也已成功下载,但underscore
作为last charater
file_one.pdf_
附加到file_name,file_two.pdf_
,file_three.txt_
},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
等,
以下是我的代码
urls.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
views.py
<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.html
因此,在上述代码中,当文件成功上传到媒体时,它将被重定向到files_list
到download
视图功能,这些功能以表格形式显示文件总数每个文件名旁边的下载链接。
因此,当我们点击下载锚链接时,将通过执行函数underscore
下载相应的文件。
因此该文件已成功下载,但_
file_one.pdf_
附加到文件名的最后一个,如file_two.pdf_
,file_three.txt_
,underscore
等,
所以任何人都可以告诉我,上面的下载功能代码有什么问题,为什么file name
附加到underscore
以及如何从文件名中删除{{1}}。 ..
答案 0 :(得分:6)
在文件名后删除/
。
改变这个:
response['Content-Disposition'] = 'attachment; filename=%s/' % smart_str(file_name)
到此:
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)
答案 1 :(得分:5)
您的代码是正确的,但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属性有一个斜杠(/):filename=%s
/
导致问题的原因。删除此斜杠,它可以正常工作。
答案 2 :(得分:2)
这些都不是必需的。在HTML中,您可以使用<a download="{video.URL}">
例如:
<button class="btn btn-outline-info">
<a href="{{result.products.full_video.url}}" download="{{result.products.full_video.url}}" style="text-decoration:None" class="footer_link">Download<i class="fa fa-download"></i></a>
</button>
答案 3 :(得分:0)
我通过替换解决了问题
response['Content-Disposition'] = 'attachment; filename=diploma_"' + str(someID) + '.pdf"'
使用
response['Content-Disposition'] = 'attachment; filename="diploma_{}{}"'.format(str(someID),'.pdf')
答案 4 :(得分:0)
import urllib, mimetypes
from django.http import HttpResponse, Http404, StreamingHttpResponse, FileResponse
import os
from django.conf import settings
from wsgiref.util import FileWrapper
class DownloadFileView(django_views):
def get(self,request,file_name):
file_path = settings.MEDIA_ROOT +'/'+ file_name
file_wrapper = FileWrapper(open(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/' % str(file_name)
return response