私は、データベースからいくつかの異なるファイルのバイナリ データを取得し、それを Python の「zipfile」オブジェクトに格納する Flask サーバーを持っています。 Flask の「send_file」メソッドを使用して、生成された zip ファイルをコードとともに送信したいと考えています。
当初は、BytesIO(bin) を send_file の最初の引数として使用することで、非 zip ファイルを正常に送信できましたが、何らかの理由で、生成された zip ファイルでは同じことができません。次のエラーが発生します。
「ZipFile」にはバッファ インターフェイスがありません。
この zip ファイル オブジェクトを Flask を使用してユーザーに送信するにはどうすればよいですか?
これが私のコードです:
@app.route("/getcaps",methods=['GET','POST'])
def downloadFiles():
if request.method == 'POST':
mongo = MongoDAO('localhost',27017)
identifier = request.form['CapsuleName']
password = request.form['CapsulePassword']
result = mongo.getCapsuleByIdentifier(identifier,password)
zf = zipfile.ZipFile('capsule.zip','w')
files = result['files']
for individualFile in files:
data = zipfile.ZipInfo(individualFile['fileName'])
data.date_time = time.localtime(time.time())[:6]
data.compress_type = zipfile.ZIP_DEFLATED
zf.writestr(data,individualFile['fileData'])
return send_file(BytesIO(zf), attachment_filename='capsule.zip', as_attachment=True)
return render_template('download.html')
ベストアンサー1
BytesIO()
通過する必要があるバイトデータしかし、ZipFile()
オブジェクトはバイトデータではありません。実際にはファイルを作成しましたハードディスクに。
メモリ内に作成するZipFile()
には、BytesIO()
ベースとして:
memory_file = BytesIO()
with zipfile.ZipFile(memory_file, 'w') as zf:
files = result['files']
for individualFile in files:
data = zipfile.ZipInfo(individualFile['fileName'])
data.date_time = time.localtime(time.time())[:6]
data.compress_type = zipfile.ZIP_DEFLATED
zf.writestr(data, individualFile['fileData'])
memory_file.seek(0)
return send_file(memory_file, attachment_filename='capsule.zip', as_attachment=True)
このwith
ステートメントは、ZipFile()
エントリの追加が完了したときにオブジェクトが適切に閉じられることを保証し、必要なトレーラーをメモリ内のファイル オブジェクトに書き込みます。このmemory_file.seek(0)
呼び出しは、ファイル オブジェクトの読み取り/書き込み位置を先頭まで「巻き戻す」ために必要です。