1. はじめに
PythonのHTTPクライアントライブラリであるrequests
を利用して、普通のファイルダウンロードを行う方法について説明したいと思います。Rest API(json形式)
によるファイルダウンロードについては次回説明する予定です。
なお、アップロードについては「Pythonのrequestsを利用してmultipart/form-dataのFormにファイルアップロードする方法」を参照ください。
2. ソースコード
# -*- coding: utf-8 -*-
import requests
import os
from datetime import datetime
# ★ポイント1
# ex) set DOWNLOAD_SAVE_DIR=C:/Temp/flaskDownloadSaveDir
DOWNLOAD_SAVE_DIR = os.getenv("DOWNLOAD_SAVE_DIR")
# main
if __name__ == "__main__":
# ★ポイント2
url = 'http://localhost:3000/report3/0000001'
response = requests.get(url)
# ★ポイント3
contentType = response.headers['Content-Type']
contentDisposition = response.headers['Content-Disposition']
ATTRIBUTE = 'filename='
fileName = contentDisposition[contentDisposition.find(ATTRIBUTE) + len(ATTRIBUTE):]
# ★ポイント4
saveFileName = datetime.now().strftime("%Y%m%d_%H%M%S_") + fileName
saveFilePath = os.path.join(DOWNLOAD_SAVE_DIR, saveFileName)
with open(saveFilePath, 'wb') as saveFile:
saveFile.write(response.content)
★ポイント1
サンプルではダウンロードしたファイルを保存するディレクトリを環境変数から取得できるようにしました。
★ポイント2
requests
のget()
でファイルダウンロードのURLにアクセスします。特別なことはありません。なお、サンプルではHTTPのGETメソッドでアクセスするAPIにしています。
★ポイント3
requests
のheaders
を利用してHTTPレスポンスヘッダからContentTypeや添付ファイルのファイル名を取得します。
なお、サンプルのAPIは「Flaskでファイルダウンロードを実現する3つの方法」で紹介している内容を前提としています。
(注意)
サンプルのファイルダウンロードAPIではContent-Disposition
ヘッダで添付ファイル名を指定する仕様としています。
Content-Disposition
ヘッダは必須ではないので、APIによっては付与されていない場合もあるので注意してください。付与されていない場合はContentTypeから拡張子を類推してファイル名を決める必要があります。
★ポイント4
requests
のHTTPレスポンスのcontent
を利用してダウンロードファイルのデータにアクセスし、バイナリデータをファイルとして保存します。普通のファイル保存の処理です。
サンプルでは★ポイント1で取得したディレクトリに、年月日時分秒のプレフィックスを付与して保存しています。
3. さいごに
今回はrequests
を利用して普通のファイルダウンロードを行う方法について説明しました。
次回はrequests
でRest API(json形式)
によるファイルダウンロードを行う方法について説明する予定です。