簡體   English   中英

使用Python請求將圖像和元數據上載到公共Amazon S3存儲桶

[英]Upload images and metadata to public Amazon S3 bucket with Python requests

我知道,有用於Python的boto庫,但是,我想要做的就是將大量圖像文件(包括元數據)上傳到公共S3存儲桶。 圖像應該進入存儲桶內的各個子目錄。

使用cURL,這應該是有效的:

curl -v -F "key=test/test.jpg" -F "file=@test.jpg" http://my-public-bucket.s3.amazonaws.com/

所以我認為只應該使用urllib,urllib2和/或Python請求。 但是怎么樣? 我對Amazon S3和cURL完全陌生。

另外,將一些元數據與圖像一起存儲的最佳方法是什么? 一個額外的JSON字符串文件?

使用boto (版本2.6.0)你會這樣做:

import boto

connection = boto.connect_s3()
bucket = connection.get_bucket('mybucket')
key = bucket.new_key('myimage.jpg')
key.set_contents_from_filename('myimage.jpg')
key.set_metadata(...)

確保您已獲得環境變量AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY的憑據。

而已。

僅適用於Python請求:

import requests
r = requests.post('my_public_bucket', files={'file': open('/path/test.txt', 'rb')}, data={'key': 'test/test.txt'})

您的cURL字符串大致轉換為以下內容:

import requests

url = 'http://my-public-bucket.s3.amazonaws.com/'
files = {
    'key': ('', 'test/test.jpg'),
    'file': open('test.jpg', 'rb'),
}

r = requests.post(url, files=files)

此StackOverflow答案中提供了請求的分段上傳語法的一般形式。

要上傳到已簽名的網址並請求我必須這樣做:

with open('photo_1.jpg', 'rb') as content_file:
    content = content_file.read()
result = requests.put(url=upload_url, headers={}, data=content)

這很糟糕,因為它將所有內容加載到內存中,但它應該讓你超過最初的駝峰。

另外,當使用curl時,我必須使用不同的選項:

curl -X PUT --upload-file photo_1.jpg <url>

注意:當我使用boto在我的服務器上創建url時,我設置headers = None,這樣頭文件就不會成為問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM