使用boto3上传文件到S3时,file_upload()和put_object()有什么区别?

61

我正在使用boto3尝试上传文件。如果有人能解释一下file_upload()put_object() s3 bucket 方法boto3中确切的区别将会很有帮助?

  • 它们之间是否有任何性能差异?
  • 它们中的任何一个是否在后台处理分段上传功能?
  • 两者的最佳使用情况是什么?

你能否为 file_upload() 函数添加文档链接? - user378704
据我所知,file_upload()使用s3transfer,在某些任务上速度更快: http://boto3.readthedocs.io/en/latest/_modules/boto3/s3/transfer.html - mootmoot
3个回答

61

upload_file 方法由 S3 传输管理器处理,这意味着如果需要,它将自动在幕后为您处理多部分上传。

put_object 方法直接映射到低级 S3 API 请求。 它不会为您处理多部分上传。 它将尝试通过单个请求发送整个正文。


太好了!那么put_object()方法怎么办? - Tushar Niras
1
“put_object” 方法直接映射到底层的 S3 API 请求。它不会为您处理多部分内容,而是尝试在一个请求中发送整个主体。 - garnaat
2
如果在upload_file执行分块上传时中断,这会导致上传失败吗?因为只有一些部分被上传和完整性检查,S3是否会接受半上传的文件? - CMCDragonkai
根据AWS文档:“Amazon S3永远不会添加部分对象;如果您收到成功响应,则Amazon S3已将整个对象添加到存储桶中。” - Alex Kir

6

我觉得另一个值得注意的区别是,upload_file() API允许您使用回调函数跟踪上传进度。有关详细信息,请单击此处

另外,正如boto的创建者@garnaat所提到的,upload_file()在幕后使用了多部分技术,因此检查端到端文件完整性并不直接(虽然有一种方法),但put_object()会一次性上传整个文件(尽管限制为5GB),这样通过传递Content-MD5参数更容易检查完整性,而该参数已经作为put_object() API的参数提供。


感谢添加5GB限制... 5GB的限制是针对压缩文件还是未压缩文件? - Vivek Puurkayastha

4

还有一个需要提及的事情是,put_object()需要一个文件对象,而upload_file()需要上传文件的路径。例如,如果我已经在本地存储了一个json文件,那么我会使用upload_file(Filename='/tmp/my_file.json', Bucket=my_bucket, Key='my_file.json')

然而,如果我的任务中有一个字典,我可以将其转换为json,并使用put_object()来实现:

records_to_update = {'Name': 'Sally'}
records_to_update_json = json.dumps(records_to_update, default=str)
put_object(Body=records_to_update_json, Bucket=my_bucket, Key='my_records')


1
你也可以使用 upload_fileobj 来实现这个功能。 - Nimrod Morag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接