使用tinys3上传到Amazon S3

时间:2014-09-01 09:09:43

标签: python amazon-s3

我使用Python和tinys3将文件写入S3,但它无法正常工作。这是我的代码:

import tinys3
conn = tinys3.Connection('xxxxxxx','xxxxxxxx',tls=True)

f = open('testing_s3.txt','rb')
print conn.upload('testing_data/testing_s3.txt',f,'testing-bucket')
print conn.get('testing_data/testing_s3.txt','testing-bucket')

这给出了输出:

<Response [301]>
<Response [301]>

当我尝试指定端点时,我得到:

requests.exceptions.HTTPError: 403 Client Error: Forbidden

知道我做错了吗?

编辑:当我尝试使用boto时,它可以正常工作,因此问题不在于访问密钥或密钥。

3 个答案:

答案 0 :(得分:14)

我终于弄明白了。这是正确的代码:

import tinys3
conn = tinys3.Connection('xxxxxxx','xxxxxxxx',tls=True,endpoint='s3-us-west-1.amazonaws.com')

f = open('testing_s3.txt','rb')
print conn.upload('testing_data/testing_s3.txt',f,'testing-bucket')
print conn.get('testing_data/testing_s3.txt','testing-bucket')

您必须使用区域端点,而不是s3.amazonaws.com。您可以从此处查找区域端点:http://docs.aws.amazon.com/general/latest/gr/rande.html。查看标题“Amazon Simple Storage Service(S3)”。

我从这个帖子中得到了这个想法:https://github.com/smore-inc/tinys3/issues/5

答案 1 :(得分:3)

如果使用IAM用户,则必须允许“s3:PutObjectAcl”操作。

答案 2 :(得分:0)

不知道为什么,但这段代码对我来说没用。 我已经切换到boto,它只是从1次上传文件。

  AWS_ACCESS_KEY_ID = 'XXXXXXXXXXXXXXXXXXXXX'
  AWS_SECRET_ACCESS_KEY = 'XXXXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXX'

  bucket_name = 'my-bucket'
  conn = boto.connect_s3(AWS_ACCESS_KEY_ID,
          AWS_SECRET_ACCESS_KEY)

  bucket = conn.get_bucket('my-bucket')

  print 'Uploading %s to Amazon S3 bucket %s' % \
     (filename, bucket_name)

  k = Key(bucket)
  k.key = filename
  k.set_contents_from_filename(filename,
      cb=percent_cb, num_cb=10)