1. はじめに
今回はflaskでRest API(json形式)
におけるファイルダウンロードの方法について説明したいと思います。普通のファイルダウンロードについては以前の記事を参照ください。
なお、クライアント側については「Pythonのrequestsを利用してRest API(json形式)でファイルダウンロードする方法」を参照ください。
2. ソースコード
# -*- coding: utf-8 -*-
from flask import Flask, make_response, jsonify
import base64
# ★ポイント1
# 2007 Office system ファイル形式の MIME タイプをサーバーで登録する
# https://technet.microsoft.com/ja-jp/library/ee309278(v=office.12).aspx
XLSX_MIMETYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
# flask
app = Flask(__name__, static_folder=None)
# rest api
# case 4 : json with base64 encoding
# {
# 'fileName': 'ファイル名',
# 'contentType': 'mimetype',
# 'contentData': 'バイナリデータをbase64でエンコードしたascii文字列'
# }
@app.route('/download/json', methods=['GET'])
def report4():
# ★ポイント2
downloadData = {
'fileName': 'demo4.xlsx',
'contentType': XLSX_MIMETYPE,
# 'contentData': は別途設定
}
# ★ポイント3
fileDataBinary = open('demo4.xlsx', 'rb').read()
downloadData['contentData'] = base64.b64encode(fileDataBinary)
# ★ポイント4
return make_response(jsonify(downloadData))
# main
if __name__ == "__main__":
print(app.url_map)
app.run(host='localhost', port=3000)
★ポイント1
ファイルをダウンロードした際、クライアント側で適切にファイルを処理できるようにmimetypeを定義します。
Excelファイル(拡張子xlsx)のmimetypeはマイクロソフトのサイトを参考にしました。
★ポイント2
ダウンロードデータを定義します。今回はタイトルにもあるようにjson形式(Dict)としました。contentDataフィールドはこの後、個別に設定します。
- fileNameフィールド : ダウンロードファイルのファイル名
- contentTypeフィールド : ダウンロードファイルのMIMEタイプ
- contentDataフィールド : ダウンロードファイルのファイルデータ
★ポイント3
今回の記事の最大ポイントです。jsonではバイナリデータを設定できないため、base64でエンコードしたascii文字列とします。
base64.b64encode()
を利用してバイナリデータをエンコードします。
★ポイント4
通常のRest API
の場合と同様にmake_response()
とjsonify()
を利用してレスポンスを作成するだけです。
3. さいごに
今回はflaskでRest API(json形式)
におけるファイルダウンロードの方法について説明しました。ポイントはファイルのバイナリデータをbase64でエンコードすることで、それ以外は特に変わったことはなかったと思います。