0

我正在使用 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) 但这并没有解决问题我还尝试用句点替换文件名中的任何空格,这确实有效!但我确信有一个干净的解决方案!

4

2 回答 2

1

回答一个老问题,我知道,但实际问题是您没有用双引号将文件名括起来(它必须是双引号,而不是单引号)。IE 和 Chrome 会读取到行尾,但 Firefox 会读取到第一个空格并停止。

因此,只需更改response['Content-Disposition'] = "attachment; filename=" + entry.name为即可response['Content-Disposition'] = 'attachment; filename="%s"'%(entry.name)

于 2014-03-06T14:32:29.773 回答
0

基于django.views.static

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
于 2013-02-01T13:25:21.620 回答