【问题标题】:Difference between upload() and putObject() for uploading a file to S3?将文件上传到 S3 的 upload() 和 putObject() 之间的区别?
【发布时间】:2016-07-18 17:16:39
【问题描述】:

在aws-sdk的S3类中,upload()putObject()有什么区别?他们似乎在做同样的事情。为什么我可能更喜欢其中一个?

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    使用 AWS SDK upload() 优于 putObject() 的优势如下:

    • 如果上传完成时上报的MD5不匹配,则 重试。
    • 如果文件足够大,使用分段上传方式上传 部分并行。
    • 根据客户端的重试设置重试。
    • 您可以用于进度报告。
    • 如果不提供,则根据文件扩展名设置 ContentType 它。

    【讨论】:

    • 那么为什么有人更喜欢putObject() 而不是upload()
    • putObject 主要用于 AWS S3 的策略中。
    • 根据文档,您的第一个要点是错误的:“上传任意大小的缓冲区、blob 或流”
    • upload() 函数的文档。
    • 您能详细说明一下吗?这些点是关于upload() 还是关于putObject()。当您说“您可以用于进度报告”时。 - 究竟使用哪个功能? upload()putObject()?
    【解决方案2】:

    upload() 允许您控制对象的上传方式。例如,您可以定义并发和部分大小。

    来自他们的docs: 如果有效负载足够大,则使用部分的智能并发处理上传任意大小的缓冲区、blob 或流。

    我发现的一个具体好处是upload() 将接受没有定义内容长度的流,而putObject() 不接受。

    这很有用,因为我有一个允许用户上传文件的 API 端点。该框架以没有内容长度的可读流的形式将文件传递给我的控制器。我不必测量文件大小,只需将其直接传递给upload() 调用即可。

    【讨论】:

    • 是否可以安全地假设,当有疑问时更喜欢 s3 sdk 的上传而不是 putObject 方法?
    • @AniruddhaRaje 我认为这取决于用例。默认情况下,我个人会使用 putObject,因为它遵循默认约定 *Object(getObject、headObject 等)。
    【解决方案3】:

    在查找相同信息时,我偶然发现:https://aws.amazon.com/blogs/developer/uploading-files-to-amazon-s3/

    这个来源有点过时(引用而不是 upload_file()put() - 或者它可能是 Ruby SDK?),但看起来 putObject() 用于比 upload() 更小的对象。

    它推荐upload()并说明原因:

    这是使用 SDK 将文件上传到 桶。使用这种方法有以下好处:

    • 管理大于 15MB 的对象的分段上传。
    • 正确地以二进制模式打开文件以避免编码问题。
    • 使用多个线程并行上传大型对象的各个部分。

    然后覆盖putObject()操作:

    对于较小的对象,您可以选择使用#put

    编辑:我的.upload() 上的.abort() 操作出现问题,发现这很有帮助:abort/stop amazon aws s3 upload, aws sdk javascript

    现在我来自https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html 的各种其他事件也正在触发!对于.upload(),我只有“httpUploadProgress”。

    【讨论】:

      【解决方案4】:

      这个问题是大约六年前提出的,我在搜索有关最新 AWS Node.js SDK (V3) 的信息时偶然发现了这个问题。 SDK 的 V2 支持“upload”和“putObject”功能,而 V3 SDK 仅支持“Put Object”功能作为“PutObjectCommand”。 “UploadPartCommand”和“UploadPartCopyCommand”支持分段上传功能,但V2中不支持独立的“上传”功能,也没有“UploadCommand”功能。

      因此,如果您迁移到 V3 SDK,您将需要迁移到 Put Object。 Get Object 在 V3 中也有所不同。不再返回缓冲区,而是返回可读流或 Blob。因此,如果您通过“Body.toString()”获取数据,您现在必须实现流读取器或处理 Blob。

      【讨论】:

        猜你喜欢
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多