公式ドキュメント Uploading Files — Flask Documentation などで save()
メソッドでアップロードされたファイルをサーバー上に保存する手順は紹介されているものの、ファイルを保存せずそのまま読み込む方法がなかなか見当たらなかったため備忘録として残します。
その実体はバッファリングバイナリストリーム
Flask で request.files.get()
(または request.files.getlist()[i]
) を実行すると、Werkzeug の datastructures.FileStorage
オブジェクトを得られます。このオブジェクトの stream
こそがアップロードされたファイルのストリーム本体です。さらに FileStorage.stream
は io.BufferedIOBase
を継承しているようなので、このストリームを煮るなり焼くなりすればよいみたいです。
アップロードされたCSVを読む
もしアップロードされたファイルをテキストとして読みたい場合、io.TextIOWrapper
でテキストストリームにしてやると便利です。
クライアントからアップロードされたCSVをファイルを読み込むサンプルを示します。
import io
from flask import Flask, jsonify, request
@app.route('/upload/', methods=['POST'])
def csv_upload():
filebuf = request.files.get('csvfile')
if filebuf is None:
return jsonify(message='ファイルを指定してください'), 400
elif 'text/csv' != filebuf.mimetype:
return jsonify(message='CSVファイル以外は受け付けません'), 415
text_stream = io.TextIOWrapper(filebuf.stream, encoding='cp932')
for row in csv.reader(text_stream):
# do something
return jsonify(message=f'{filebuf.filename!r} を読み込みました'), 200