LoginSignup
8
11

More than 5 years have passed since last update.

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

Posted at

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

8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11