csv等扩展的HttpResponse内容类型在Firefox中不起作用,但在Chrome和IE中正常。

0 投票
2 回答
1766 浏览
提问于 2025-04-17 14:26

我正在用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),这样就可以了。

撰写回答