AWS S3表单POST上传文件Content-Type被忽略,如何设置?
问题描述
使用表单POST方式上传文件至AWS S3存储桶时,文件可成功上传,但S3会忽略文件的Content-Type/MIME类型:
- 表单的
file字段包含一个Content-Type为video/x-matroska;codecs=avc1,pcm的Blob key字段已指定文件在桶内的存储路径- 后续通过HEAD或GET请求该对象时,返回的Content-Type仅为
binary/octet-stream
尝试添加Content-Type、ContentType、content_type这几个表单字段并填入Blob的类型,均未生效。原始请求数据如下:
------WebKitFormBoundaryJJ9VA3o1bbQ3DIPJ Content-Disposition: form-data; name="key" woot/woot/wootwootwoot ------WebKitFormBoundaryJJ9VA3o1bbQ3DIPJ Content-Disposition: form-data; name="file"; filename="woot/woot/wootwootwoot" Content-Type: video/x-matroska;codecs=avc1,pcm Eߣ£BB÷BòBóBmatroskaBBSgÿÿÿÿÿÿÿI©f*×±B@MChromeWAChromeT®kà®±×sÅoù¾¤=ÆA_PCM/FLOAT/IEEEáµG,Dbd ®«×sź<ø V_MPEG4/ISO/AVCà°º8 ------WebKitFormBoundaryJJ9VA3o1bbQ3DIPJ Content-Disposition: form-data; name="Content-Type" video/x-matroska;codecs=avc1,pcm ------WebKitFormBoundaryJJ9VA3o1bbQ3DIPJ Content-Disposition: form-data; name="ContentType" video/x-matroska;codecs=avc1,pcm ------WebKitFormBoundaryJJ9VA3o1bbQ3DIPJ Content-Disposition: form-data; name="content_type" video/x-matroska;codecs=avc1,pcm ------WebKitFormBoundaryJJ9VA3o1bbQ3DIPJ--
解决方案
可以通过表单上传设置Content-Type,但必须满足三个关键条件:
在S3上传策略(Policy)中明确允许
Content-Type字段
你的Policy必须包含Content-Type作为允许的表单字段,可指定允许的取值范围(如特定MIME类型或通配符*)。示例Policy片段:{ "expiration": "2024-12-31T12:00:00Z", "conditions": [ ["starts-with", "$key", "woot/"], ["starts-with", "$Content-Type", "video/"], {"bucket": "your-bucket-name"} ] }若需要精确匹配,可写成
{"Content-Type": "video/x-matroska;codecs=avc1,pcm"}。表单仅保留
Content-Type字段(严格大小写)
无需添加ContentType或content_type字段,只保留字段名为Content-Type的表单项,值设置为目标MIME类型。多余字段会被S3忽略,只有符合Policy定义的字段才会被处理。签名计算必须包含
Content-Type字段
生成S3签名时,必须将Content-Type纳入签名计算范围。若签名时遗漏该字段,S3会拒绝生效该字段,直接使用默认的binary/octet-stream。
验证要点
- 检查Policy是否正确包含
Content-Type条件,无拼写错误 - 确保表单仅保留字段名为
Content-Type的项 - 确认签名生成时已包含
Content-Type参数
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

