FlaskでRest API(json形式)のファイルダウンロードを実現する方法

More than 1 year has passed since last update.


1. はじめに

今回はflaskでRest API(json形式)におけるファイルダウンロードの方法について説明したいと思います。普通のファイルダウンロードについては以前の記事を参照ください。

なお、クライアント側については「Pythonのrequestsを利用してRest API(json形式)でファイルダウンロードする方法」を参照ください。


2. ソースコード


RestAPI(json形式)でファイルダウンロードさせる場合

# -*- 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でエンコードすることで、それ以外は特に変わったことはなかったと思います。