使用boto3将文件上传到S3时,file_upload()和put_object()之间的区别是什么

Tus*_*ras 21 python amazon-s3 amazon-web-services boto3

我正在使用boto3并尝试上传文件.这将是有益的,如果有人会解释之间的精确差异file_upload()put_object()S3存储方法boto3

  • 有任何性能差异吗?
  • 其中有没有人在幕后处理分段上传功能?
  • 两者的最佳用例是什么?

gar*_*aat 17

upload_file方法由S3 Transfer Manager处理,这意味着如有必要,它将在幕后自动处理多部分上传.

put_object方法直接映射到低级S3 API请求.它不会为您处理分段上传.它将尝试在一个请求中发送整个正文.

  • 如果在进行分段上传时中断“upload_file”,是否会导致上传损坏?因为只上传了部分部分并检查了完整性,S3会接受上传一半的文件吗? (2认同)

Pra*_*pta 6

我认为值得注意的另一个区别是 upload_file() API 允许您使用回调函数跟踪上传。您可以在这里查看。

另外,boto 的创建者 @garnaat 已经提到, upload_file() 在幕后使用 multipart,因此它不能直接检查端到端文件完整性(存在一种方法),但 put_object() 一次性上传整个文件(上限为 5GB)不过)通过传递已作为 put_object() API 中的参数提供的 Content-MD5 可以更轻松地检查完整性。


dee*_*lie 5

另一件需要提到的是,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')

Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用“upload_fileobj” (3认同)