PythonのFlaskでデータベースのデータをCSV形式で保存して、そのファイル名に日本語を混ぜると何故か上手くダウンロードできませんでした。
ファイル名に日本語が含まれない場合はうまく動作します。
PythonのFlaskでダウンロードファイル名に日本語が混ざっても文字化けをしない方法です。
Flaskでダウンロードファイル名に日本語があっても文字化けを回避する
Flaskでサーバーからのダウンロードファイル名に日本語を混在しているとダウンロードできません。
ファイルをサーバ上に作るところまでは動作しますが、最後のクライアントへのResponseが失敗するようです。
そこでそれを回避する方法を調べた結果見つけました。
import urllib.parse downloadFileName=”これは日本語ファイル名.csv" response = make_response() wb = open( downloadFileName, "r" ) response.data = wb.read() wb.close() response.headers['Content-Disposition'] = "attachment; filename={}".format( urllib.parse.quote( downloadFileName )) response.mimetype = 'text/csv' os.remove(downloadFileName) return response
ファイル名を「urllib.parse.quote()」で変換してからResponseにセットします。
まとめ
Flaskでサーバらのダウンロードファイル名に日本語を混在したファイル名でダウンロードさせるにはファイル名を「urllib.parse.quote()」で変換してからResponseにセットします。
そうすることで正しくクライアントでファイル名が認識でき、ファイルをダウンロードすることができるようになります。
以上、Flaskでダウンロード時の日本語ファイル名の文字化けを回避する方法でした。