はじめに

Python boto3 で AWS S3 を操作する では、ローカルに保存されているファイルや画像をアップロードする方法などを調べた。

また、Python requests で画像をダウンロードして保存する方法 では、requests を使って、画像をダウンロードする方法を調べた。

今回は requests でダウンロードした画像を、ローカルに保存することなく 直接 S3 にアップロードする方法をまとめた。

TL;DR

  • res = requests.get(image_url, stream=True) でダウンロード
  • bucket.upload_fileobj(res.raw, "key/of/file") でアップロード
  • 必要に応じて ExtraArgs={"ContentType": res.headers["Content-Type"]} を付与

目的・やったこと

requests でダウンロードした画像を、ローカルに保存することなく 直接 S3 にアップロードする方法を調べた。

目次

  1. はじめに
  2. TL;DR
  3. 目的・やったこと
  4. 環境・条件
  5. 詳細
    1. stream=True を付けてダウンロード
    2. upload_fileobj でアップロード
  6. まとめ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.5
BuildVersion: 18F132

$ pyenv --version
pyenv 1.2.13

$ python --version
Python 3.6.2 :: Anaconda, Inc.

$ pip --version
pip 19.1.1 from /Users/r17n/.pyenv/versions/anaconda3-5.0.0/lib/python3.6/site-packages/pip (python 3.6)

$ pip show boto3 requests
Name: boto3
Version: 1.9.200

Name: requests
Version: 2.18.4

詳細

stream=True を付けてダウンロード

1
res = requests.get(url, stream=True)

upload_fileobj でアップロード

upload_file ではなく、upload_fileobj メソッドを使い、第一引数には res.raw を指定する。

1
bucket.upload_fileobj(res.raw, "key/of/file")

前回と同様、必要に応じて ExtraArgs を指定する。

1
bucket.upload_fileobj(res.raw, "key/of/file", ExtraArgs={"ContentType": res.headers["Content-Type"], "ACL": "public-read"})

まとめ

  • res = requests.get(image_url, stream=True) でダウンロード
  • bucket.upload_fileobj(res.raw, "key/of/file") でアップロード
  • 必要に応じて ExtraArgs={"ContentType": res.headers["Content-Type"]} を付与

参考文献

関連記事