【问题标题】:Unable to set object metadata in AWS S3 using HTTP headers无法使用 HTTP 标头在 AWS S3 中设置对象元数据
【发布时间】:2016-02-22 18:09:23
【问题描述】:

我的目标是将二进制文件上传到 S3 存储桶,并用两条元数据对其进行标记。我没有在 AWS 开发工具包支持的任何平台上进行开发,所以我(基本上)在构建自己的 HTTP 请求。这些文件正在进入 S3,但尽管按照说明进行操作,但元数据没有出现(在 S3 的基于 Web 的 GUI 中,也没有在我发出 HEAD 请求时),我试图了解我错过了什么。

documentation 说(强调我的):

上传对象时,您还可以将元数据分配给对象。当您发送 PUT 或 POST 请求以创建对象时,您可以将此可选信息作为名称-值对提供。使用 REST API 上传对象时,可选的用户定义的元数据名称必须以“x-amz-meta-”开头,以区别于其他 HTTP 标头

通过将我的应用程序指向一个简单地记录所有请求的本地测试 HTTP 服务器,我已经确认我正在发送文档建议的标头:

POST / HTTP/1.1
host: 192.168.1.8:8082
user-agent: test
accept-language: en-us
accept-encoding: gzip, deflate
accept: */*
content-type: multipart/form-data; boundary=----fixed.boundary.value
connection: keep-alive
content-length: 852705
x-amz-meta-testheader: value-ONE


------fixed.boundary.value
Content-Disposition: form-data; name="metadata"

{"testheader":"value-TWO"}
------fixed.boundary.value
Content-Disposition: form-data; name="testheader"

value-THREE
------fixed.boundary.value
Content-Disposition: form-data; name="upload"

{"testheader":"value-FOUR"}
------fixed.boundary.value
Content-Disposition: form-data; name="key"

binaryfilename.ext
------fixed.boundary.value
Content-Disposition: form-data; name="acl"

public-read
------fixed.boundary.value
Content-Disposition: form-data; name="file"; filename="binaryfilename.ext"
Content-Type: application/octet-stream
Content-Length: 851750

<inlined binary content>
------fixed.boundary.value--

此请求包含所需元数据的多种变体。我正在使用第三方库来处理文件上传,它会生成整个请求。它的 API 文档很少,所以当 S3 没有按照我希望的方式做出反应时,我在插入元数据的位置进行了一些更改,以及我在网络上看到的一些其他内容,希望能够戳。到目前为止,什么都没有。官方文档都没有在 HTTP 级别明确解决 multipart/form-data 场景,因此我不得不应用霰弹枪方法并猜测 S3 可能在正文中的哪个位置查找元数据。

我从文档中了解到x-amz-meta-* 标头应该足以标记上传的文件。那么,为什么它不起作用?自动元数据功能是否取决于存储桶配置?这是付费功能吗?这仅适用于作为文本传输的数据(或“对象”)吗?还有其他方法可以调试吗?

感谢任何帮助。我需要在 HTTP 层理解这一点,所以让我们坚持下去。

【问题讨论】:

  • 你能展示你的代码吗?

标签: http amazon-web-services amazon-s3


【解决方案1】:

您引用的文档有点不清楚元数据如何与POST 上传配合使用。在这种情况下,请求标头没有完成。

请参阅http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html 以获得更好的视角。

形式:

<input type="hidden" name="x-amz-meta-my-meta-key" value="my-meta-value" />

在电线上:

------fixed.boundary.value
Content-Disposition: form-data; name="x-amz-meta-my-meta-key"

my-meta-value

请注意,这些也必须包含在已签署的政策声明中。

【讨论】:

  • 谢谢,@迈克尔!我想我觉得文档很明确,但你是 100% 正确的。
  • +1 表示“请注意,这些也必须在签署的政策声明中”,我错过了这一点。 沉重的叹息
猜你喜欢
  • 1970-01-01
  • 2013-10-25
  • 2021-06-06
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多