【发布时间】: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