csv等扩展的HttpResponse内容类型在Firefox中不起作用,但在Chrome和IE中正常。
我正在用PYTHON和DJANGO来做一个文件分享系统。当用户尝试下载文件时,在Chrome和IE浏览器上都能正常工作,但在Firefox上就不行了。如果Firefox不认识文件的扩展名(比如.pl和.csv),它只会返回文件名的一部分,而且没有扩展名。
视图
filename = os.path.join(MEDIA_ROOT, entry.myfile.url)
wrapper = FileWrapper(file(filename,'rb'))
response = HttpResponse(wrapper, content_type='application/octet-stream')
response['Content-Length'] = os.path.getsize(filename)
response['Content-Disposition'] = "attachment; filename=" + entry.name
我试过用content_type=mimetypes.guess_type(filename),但这个方法没有解决问题。我还试过把文件名中的空格替换成点,这个方法有效!不过我相信还有更好的解决办法!!
2 个回答
0
这个内容是关于 django.views.static
的,简单来说,它是 Django 框架中处理静态文件的一个部分。静态文件就是那些不会改变的文件,比如图片、CSS样式表和JavaScript文件。Django 提供了这个功能,让我们可以方便地在网站上展示这些文件。
import mimetypes
import os
import stat
from django.http import HttpResponse
statobj = os.stat(fullpath)
mimetype, encoding = mimetypes.guess_type(fullpath)
mimetype = mimetype or 'application/octet-stream'
with open(fullpath, 'rb') as f:
response = HttpResponse(f.read(), mimetype=mimetype)
if stat.S_ISREG(statobj.st_mode):
response["Content-Length"] = statobj.st_size
if encoding:
response["Content-Encoding"] = encoding
response['Content-Disposition'] = 'inline; filename=%s'%os.path.basename(fullpath)
return response
1
这是对一个老问题的回答,我知道。但实际的问题是你没有用双引号把文件名括起来(而且必须是双引号,不是单引号)。IE和Chrome会读取到行的末尾,但Firefox会读取到第一个空格就停止。
所以只需要把 response['Content-Disposition'] = "attachment; filename=" + entry.name
改成 response['Content-Disposition'] = 'attachment; filename="%s"'%(entry.name)
,这样就可以了。