ダウンロードのためにzipファイルをクライアントに「ストリーミング」しようとする次のビューコードがあります。
import os
import zipfile
import tempfile
from pyramid.response import FileIter
def zipper(request):
_temp_path = request.registry.settings['_temp']
tmpfile = tempfile.NamedTemporaryFile('w', dir=_temp_path, delete=True)
tmpfile_path = tmpfile.name
## creating zipfile and adding files
z = zipfile.ZipFile(tmpfile_path, "w")
z.write('somefile1.txt')
z.write('somefile2.txt')
z.close()
## renaming the zipfile
new_zip_path = _temp_path + '/somefilegroup.zip'
os.rename(tmpfile_path, new_zip_path)
## re-opening the zipfile with new name
z = zipfile.ZipFile(new_zip_path, 'r')
response = FileIter(z.fp)
return response
ただし、これはブラウザーで取得する応答です。
Could not convert return value of the view callable function newsite.static.zipper into a response object. The value returned was .
FileIter を正しく使用していないと思います。
アップデート:
Michael Merickel の提案で更新して以来、FileIter 関数は正しく機能しています。ただし、クライアント (ブラウザ) に表示される MIME タイプのエラーが残っています。
Resource interpreted as Document but transferred with MIME type application/zip: "http://newsite.local:6543/zipper?data=%7B%22ids%22%3A%5B6%2C7%5D%7D"
問題をよりよく説明するために、Github に小さなファイルを含めました.py
: https://github.com/thapar/zipper-fix.pt