Python
Flask
ダウンロード
download

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

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