我知道,有用于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字符串文件?
答案 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_ID
和AWS_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,这样标题就不会成为问题。