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

时间:2017-09-30 20:41:03

标签: python-3.x amazon-s3 boto3

虽然我指的是将文件上传到S3的示例代码,但我发现了以下两种方法。

使用boto3.resource.put_object():

s3_resource = boto3.resource('s3')
s3_resource.put_object(Bucket = BUCKET,  Key = 'test', Body= b'some data')

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

client = boto3.client('s3')
transfer = S3Transfer(client) 
transfer.upload_file('/my_file', BUCKET, 'test') 

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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