使用Python请求将图像和元数据上载到公共Amazon S3存储桶

时间:2014-01-08 22:24:19

标签: python upload amazon-s3 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字符串文件?

4 个答案:

答案 0 :(得分:1)

使用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中的凭据。

就是这样。

答案 1 :(得分:1)

仅适用于Python请求:

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

答案 2 :(得分:1)

您的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)

请求的分段上传语法的一般形式可在this StackOverflow answer中找到。

答案 3 :(得分:0)

要上传到已签名的网址并请求我必须这样做:

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,这样标题就不会成为问题。