LoginSignup
15
20

More than 5 years have passed since last update.

Pythonのrequestsを利用してRest API(json形式)にファイルアップロードする方法

Posted at

1. はじめに

PythonのHTTPクライアントライブラリであるrequestsを利用して、json形式のデータを送受信するRest APIでファイルアップロードを行う方法について説明したいと思います。
ポイントはbase64エンコードしてバイナリデータをascii文字列として送信することです。

2. ソースコード

jsonFileUploadDemo.py
# -*- coding: utf-8 -*-
import requests
import base64

# ★ポイント1
XLSX_MIMETYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

# main
if __name__ == "__main__":

    # ★ポイント2
    uploadData = {
        'fileName': 'demo01.xlsx',
        'contentType': XLSX_MIMETYPE,
        # 'contentData': は別途設定
    }

    # ★ポイント3
    fileDataBinary = open('demo01.xlsx', 'rb').read()
    uploadData["contentData"] = base64.b64encode(fileDataBinary)

    # ★ポイント4
    url = 'http://localhost:3000/data/json/upload'
    response = requests.post(url, json=uploadData)

    print(response.status_code)
    print(response.content)

★ポイント1
ファイルをアップロードする場合、ファイルフォーマットをサーバに知らせるため、MIMEタイプ(コンテントタイプ)を利用するのが一般的です。
最終的には利用するRest APIの仕様に準拠することになりますが、サンプルでもMIMEタイプを利用することにします。なお、xlsxのMIMEタイプは「2007 Office system ファイル形式の MIME タイプをサーバーで登録する」を参考にしました。

★ポイント2
Rest APIの入力データを定義します。今回はタイトルにもあるようにjson形式(Dict)としました。contentDataフィールドはこの後、個別に設定します。

  • fileNameフィールド : アップロードファイルのファイル名
  • contentTypeフィールド : アップロードファイルのMIMEタイプ
  • contentDataフィールド : アップロードファイルのファイルデータ

★ポイント3
今回の記事の最大ポイントです。jsonではバイナリデータを設定できないため、base64でエンコードしたascii文字列を設定します。
base64エンコードはbase64.b64encode()を利用することで簡単に変換できます。

★ポイント4
requestsを利用してRest APIを呼び出します。json形式でHTTPリクエストを送信する場合、jsonパラメータを利用すると簡単です。
requestsの説明については以下の記事を参照ください。

3. さいごに

今回はrequestsでjson形式のRest APIでファイルアップロードを行う方法について説明しました。
この方法では、クライアント側ではファイルのバイナリデータをbase64でエンコードし、サーバ側では受信したデータをbase64でエンコードするオーバヘッド(余分な処理)が発生します。
ファイルのデータサイズが大きい場合はmultipart/form-dataによるFormを利用したファイルアップロードを検討した方がいいでしょう。
次回はrequestsを利用したmultipart/form-dataによるファイルアップロードについて説明したいと思います。

15
20
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
15
20