【问题标题】:Upload images and metadata to public Amazon S3 bucket with Python requests使用 Python 请求将图像和元数据上传到公共 Amazon S3 存储桶
【发布时间】:2014-01-27 06:37:01
【问题描述】:

我知道,有用于 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的原因是什么?可能只是因为你不知道?如果使用该库完成,它将是一个更短且更具可读性的解决方案。当然,除非你有充分的理由不使用它......
  • boto 是一个相当大的包,AFAIK 上传到公共存储桶不需要请求签名。那么为什么要使用整个库而不是简单的请求调用...?
  • 要免费获得所有额外的东西,您必须手动执行错误检查等操作。

标签: python upload amazon-s3 python-requests


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    Requests 的分段上传语法的一般形式见this StackOverflow answer

    【讨论】:

    • 如何给图片添加元数据?我正在使用预签名的帖子网址,我尝试在标头中添加以 x-amz-meta 开头的元数据字段,但尽管上传成功,但元数据并未更新。
    【解决方案3】:

    仅适用于 Python 请求:

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

    【讨论】:

      【解决方案4】:

      使用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 请求发送文件 :)
      • 来自柏林的问候 ;-)
      • 不 - 没有凭据将无法工作。不过,我让它与纯请求一起工作。
      猜你喜欢
      • 1970-01-01
      • 2023-02-04
      • 2014-12-23
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2014-12-19
      • 2020-12-30
      • 2018-03-11
      相关资源
      最近更新 更多