我的目标是将二进制文件上传到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-*
标题应足以标记上传的文件。那么,为什么它不起作用?自动元数据功能是否依赖于存储桶配置?这是付费功能吗?这仅适用于作为文本传输的数据(或#34;对象&#34;)吗?还有其他方法可以调试吗?
感谢任何帮助。我需要在HTTP层理解这一点,所以让我们坚持下去。
答案 0 :(得分:3)
您引用的文档对于元数据如何与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
请注意,这些也必须在签署的政策声明中。