1. ファイルアップロード、ダウンロードの基本
項番 | 方向 | 区分 | 詳細/記事 |
---|---|---|---|
① | アップロード | クライアント (requests) |
Pythonのrequestsを利用してmultipart/form-dataのFormにファイルアップロードする方法 |
② | アップロード | クライアント (requests) |
Pythonのrequestsを利用してRest API(json形式)にファイルアップロードする方法 |
③ | アップロード | サーバ (Flask) |
Flaskでmultipart/form-dataのファイルアップロードを実現する方法 |
④ | アップロード | サーバ (Flask) |
FlaskでRest API(json形式)のファイルアップロードを実現する方法 |
⑤ | ダウンロード | クライアント (requests) |
Pythonのrequestsを利用してファイルダウンロードする方法 |
⑥ | ダウンロード | クライアント (requests) |
Pythonのrequestsを利用してRest API(json形式)でファイルダウンロードする方法 |
⑦ | ダウンロード | サーバ (Flask) |
Flaskでファイルダウンロードを実現する3つの方法 |
⑧ | ダウンロード | サーバ (Flask) |
FlaskでRest API(json形式)のファイルダウンロードを実現する方法 |
1.1. マルチパートによるファイルアップロード
multipart/form-data
による、いわゆる普通のファイルアップロードの方法です。
この方法のポイントはHTTPの仕様に準拠しているため、クライアント(requests)およびサーバ(Flask)にファイルアップロードを考慮した便利なAPIが用意されていることです。
サンプルではrequests
をクライアントにしていますが、もちろんWebブラウザの標準機能でアップロードすることができます。
1.2. Rest API(json形式)
Rest API(json形式)
のjsonの1フィールドにファイルデータを格納する方法です。
jsonにバイナリデータを設定できないため、バイナリデータをbase64でエンコードしたascii文字列を設定する方法が多いです。
jsonのデータ構造はAPIに依存するため、利用するRest API(json形式)
毎に仕様を確認する必要があります。
{
'fileName': 'ファイル名',
'contentType': 'mimetype',
'contentData': 'バイナリデータをbase64でエンコードしたascii文字列'
}
1.3. 普通のファイルダウンロード
HTTPレスポンスヘッダにファイルのコンテントタイプやファイル名を設定し、HTTPレスポンスボディにファイルのデータを設定する普通のファイルダウンロードの方法です。
こちらもHTTPの仕様に準拠しているため、クライアント(requests)およびサーバ(Flask)にファイルダウンロードを考慮した便利なAPIが用意されています。
2. 応用
2.1. Flaskで巨大ファイルのダウンロードを実現する方法(予定)
データサイズが数百MBから数GBのファイルをダウンロードさせる場合、サーバのリソース(主にメモリ)を考慮した実装を行う必要があります。
バッファリング処理を行うことで、データサイズに関わらずリソース消費が一定になる方法について説明します。
2.2. Pythonのrequestsを利用して巨大ファイルをダウンロードする方法(予定)
データサイズが数百MBから数GBのファイルをダウンロードする場合、サーバと同様にクライアントのリソース(主にメモリ)を考慮した実装を行う必要があります。
バッファリング処理を行うことで、データサイズに関わらずリソース消費が一定になる方法について説明します。
2.3. FlaskをRangeリクエストに対応させ、ダウンロードの再開(レジューム)を実現する方法(予定)
Rangeリクエストとはリソースの一部を取得する要求でHTTP 1.1で定義(RFC7233)されています。
巨大ファイルのダウンロードでは、全てのデータのダウンロードが完了する前に通信が切れてしまう場合が想定されます。
その際、未ダウンロードのデータを取得するために利用されるがRangeリクエストです。
FlaskのファイルダウンロードでこのRangeリクエストに対応する方法について説明します。