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 に答える