替换 Amazon S3 中上传文件的字节

Posted

技术标签:

【中文标题】替换 Amazon S3 中上传文件的字节【英文标题】:Replacing bytes of an uploaded file in Amazon S3 【发布时间】:2016-10-30 09:55:31 【问题描述】:

我了解,要使用 Multipart 将文件上传到 Amazon S3,请参阅此处的说明: http://docs.aws.amazon.com/AmazonS3/latest/dev/llJavaUploadFile.html

如何替换已上传文件的字节(例如,介于 4-1523 之间的字节)?我是否需要使用 Multipart Upload 来实现这一点?还是使用 HTTP 标头中指定的范围触发 REST 调用?

感谢任何建议。

【问题讨论】:

分段上传旨在上传大文件(尽管它同样适用于小文件)。它不是为了修改文件的“部分”而设计的。据我所知,在 S3 上修改文件的唯一方法是完全重新上传更新版本。 【参考方案1】:

S3 中的对象是不可变的。

如果是小对象,则需要重新上传整个对象。

如果它是一个大小超过 5MB 的对象,那么有一种解决方法允许您使用分段上传 API 的修改方法来“修补”文件。

背景:

如您所知,分段上传允许您以“部分”的形式上传文件,最小部分大小为 5MB,最大部分数为 10,000。

但是,多部分“上传”并不意味着您必须再次“上传”所有数据,如果 S3 中已经存在部分或全部数据,您可以解决它。

PUT part/copy 允许您通过在现有对象中指定八位字节范围来“上传”各个部分。或者不止一个对象。

由于上传是原子的,因此“现有对象”可以是您正在覆盖的对象,因为在您真正完成分段上传之前,它不会受到伤害并保持原位。

但似乎没有什么能阻止您使用复制功能为您想要保留的部分提供数据,避免实际上传,然后使用正常的PUT part 请求上传您想要的部分有不同的内容。

因此,虽然不是粒度为 1 个八位字节的字节范围补丁,但这对于模拟大文件的就地修改可能很有用。有效“部分”的示例将在 5MB 边界上替换最小 5 MB 块,用于小于 50GB 的文件,或在 500MB 边界上替换最小 500MB 块以用于高达 5TB 的对象,最小部分大小在这些到极端之间变化,因为要求分段上传不超过 10,000 个部分。问题是零件必须从适当的偏移量开始,您需要更换整个零件。

【讨论】:

【参考方案2】:

Michael 的回答很好地解释了问题的背景。如果您想知道,只需添加要执行的实际步骤即可。

    使用ListParts列出对象部分 识别已修改的部分 开始分段上传 使用UploadPartCopy复制未更改的部分 上传修改后的部分 完成上传以保存修改

如果您已经知道需要更改的部分,请跳过第 2 步。

提示:每个部分都有一个ETag,即指定部分的MD5哈希。这可用于验证特定部分是否已更改。

【讨论】:

以上是关于替换 Amazon S3 中上传文件的字节的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 上传文件并获取 URL

Amazon S3 直接上传无法识别文件的内容类型

Amazon S3 存储桶大文件上传

将文件从 Android 缓慢上传到 Amazon S3

使用 NodeJS 将文件上传到 Amazon S3

Amazon S3 无法通过 Cloudfront 上传文件