我可以更新现有的 Amazon S3 对象标头属性吗?

Posted

技术标签:

【中文标题】我可以更新现有的 Amazon S3 对象标头属性吗?【英文标题】:Can I update an existing Amazon S3 object header properties? 【发布时间】:2012-12-26 01:05:57 【问题描述】:

我有一个视频文件的 Content-Type 为空的问题,我想根据文件的扩展名使用 Content-Type: video/** 更新这些对象。但是,当我对内容类型相同的密钥/存储桶使用 put 方法时,它会被 '0' 内容长度覆盖。

Can I update an existing Amazon S3 object? 链接说 put 将覆盖不符合我的目的的文件 s3 对象。

注意:我不想使用 java sdk。由于移动设备的内存限制,我想使用普通的 java httpput。

【问题讨论】:

这在 s3 REST api 中有点奇怪。 PUT 应该用于创建项目,POST 用于更新,但它们同时使用 PUT 和 POST 来创建对象。老实说,我看不到更新的可能性,尽管我知道可以这样做,因为 Web 客户端和客户端工具都能够更新属性。 【参考方案1】:

您可以尝试使用具有相同源和目标的PUT COPY 请求。

PUT /yourvideo.flv HTTP/1.1
Host: bucket.s3.amazonaws.com
Date: Wed, 28 Oct 2009 22:32:00 GMT
x-amz-copy-source: /bucket/yourvideo.flv
Authorization: AWS AKIAiosFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=

显然python boto 以这种方式修改元数据

是的,我可以确认,复制工作正常:

PUT /test/123.png HTTP/1.1\r\n
Host: yourbucket.s3.amazonaws.com\r\n
Accept-Encoding: identity\r\n
Content-Length: 0\r\n
x-amz-storage-class: STANDARD\r\n
x-amz-copy-source: yourbucket/test/123.png\r\n
Date: Fri, 11 Jan 2013 15:16:48 GMT\r\n
Content-Type: image/gif\r\n # this is the content-type set
Authorization: AWS AKXXXXXDDRXXXXXX63CA:RcktkZ9nPwsXXXXXd+KXXXXXY=\r\n
x-amz-metadata-directive: REPLACE\r\n
\r\n

S3 回复:

HTTP/1.1 200 OK
x-amz-id-2: Vf1bRJd+e4ru0y73GB0Ra0xYB2vv6GLWYKsHAC4AzE+a8uZB56Xy8+YTDkJ0/wfN
x-amz-request-id: C0E6A2823F3FB3E9
Date: Fri, 11 Jan 2013 15:16:49 GMT
Content-Type: application/xml
Content-Length: 234
Server: AmazonS3

验证:

HEAD /test/123.png HTTP/1.1\r\n
Host: yourbucket.s3.amazonaws.com\r\n
Accept-Encoding: identity\r\n
Date: Fri, 11 Jan 2013 15:25:23 GMT\r\n
Content-Length: 0\r\n
Authorization: AWS AXXXIXXXXMDDXXXXX7XXXCA :HoZ4Woxxw6SWlxxxx000Rxxm8ODQ=\r\n
\r\n

S3 回复正确的内容类型(我错误地设置为 image/gif 而不是 image/png)

HTTP/1.1 200 OK
x-amz-id-2: 7Ut6sdm6i+1h7Di5UrB4v9Sn3mVCNjyDnkb4rm1jGzN6wBTgDT2/yCSHdrKG12Jd
x-amz-request-id: 38A1F6EC6ECD1D2D
Date: Fri, 11 Jan 2013 15:25:24 GMT
Last-Modified: Fri, 11 Jan 2013 15:25:24 GMT
ETag: "c09fad0faf4e6bb1148670af78b6de41"
Accept-Ranges: bytes
Content-Type: image/gif
Content-Length: 122311
Server: AmazonS3

【讨论】:

以上是关于我可以更新现有的 Amazon S3 对象标头属性吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以一次为 Amazon S3 存储桶中的所有对象设置 expires 标头吗?

如何使用 Amazon S3 SDK 更新元数据

Amazon S3 存储桶中缺少 Access-Control-Allow-Origin 标头

使用 lambda 更新 amazon s3 对象元数据而不执行对象复制?

Amazon S3 - 不存在“Access-Control-Allow-Origin”标头

被 CORS 策略阻止:从 Amazon S3 调用图像时没有“Access-Control-Allow-Origin”标头