使用 boto3.resource.put_object() 和 boto3.s3.transfer.upload_file() 将文件上传到 S3 有什么区别

Man*_*esh 5 python amazon-s3 python-3.x boto3

当我参考示例代码将文件上传到 S3 时,我发现了以下两种方法。

使用 boto3.resource.put_object():

s3_resource = boto3.resource('s3')
s3_resource.put_object(Bucket = BUCKET,  Key = 'test', Body= b'some data')
Run Code Online (Sandbox Code Playgroud)

使用 boto3.s3.transfer.upload_file():

client = boto3.client('s3')
transfer = S3Transfer(client) 
transfer.upload_file('/my_file', BUCKET, 'test') 
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这两种方式之间的区别。在任何特定用例中使用一个比另一个有什么优势。任何人都可以请详细说明。谢谢你。

ami*_*ttn 5

  • put_object 方法直接映射到低级 S3 API 请求。它将尝试在一个请求中发送整个正文。没有多部分支持boto3 文档
  • upload_file 方法由 S3 传输管理器处理,这意味着它会在必要时自动为您处理幕后的分段上传。
    • 当文件超过特定大小阈值时自动切换到多部分传输
    • 并行上传/下载文件
    • 进度回调以监控传输
    • 重试。虽然 botocore 处理流式上传的重试,但它不可能处理流式下载的重试。此模块处理这两种情况的重试,因此您无需自己实现任何重试逻辑。
    • 这个模块有一组合理的默认值。它还允许您配置传输过程的许多方面,包括:多部分阈值大小、最大并行下载、套接字超时、重试量。boto3 文档


Sno*_*son 1

可能没有什么区别 - boto3 有时有多种方法来实现同一件事。有关上传文件的更多详细信息,请参阅http://boto3.readthedocs.io/en/latest/guide/s3.html#uploads 。

  • 绝对有区别。为什么开发人员会实现两个相同的方法?使用 put_object 可以对对象的详细信息进行更多的自定义,但是一些更精细的细节需要由您的代码管理,而 upload_file 将为您进行一些猜测,但它可以更改的属性受到更多限制 (2认同)