如何设置AWS S3文件Content-Type?预签名URL上传GIF类型不显示
问题场景
- 上传流程为先生成AWS S3预签名URL,再通过PUT请求上传GIF格式文件
- 生成预签名URL、发起PUT请求两个环节均配置了Content-Type字段,但上传后在AWS管理控制台中,文件未显示为GIF类型
- 通过AWS S3网页控制台直接上传同类型GIF文件时,文件类型可正常识别显示
- 异常现象截图:

- 网页端正常上传对照截图:

故障请求的PUT请求头
Accept: application/json, text/plain, */* Accept-Encoding: gzip, deflate, br Accept-Language: en,nl;q=0.9,hu;q=0.8,de;q=0.7 Cache-Control: no-cache Connection: keep-alive Content-Length: 10912652 Content-Type: image/gif. // <--------------- Host: t44-post-cover.s3.eu-central-1.amazonaws.com Origin: http://localhost:3000 Pragma: no-cache Referer: http://localhost:3000/ sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "macOS" Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: cross-site User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 x-amz-acl: public-read
故障原因
核心错误是配置的Content-Type字段值末尾多了一个多余的英文句号:实际传入值为image/gif.,而GIF格式对应的标准MIME类型为image/gif。
S3会完全按照请求传入的字符串原样存储对象的Content-Type元数据,不会自动做格式纠错。带多余尾点的MIME值不属于标准类型,S3控制台无法匹配识别到GIF格式,就会出现类型显示异常。
S3网页控制台上传时,会自动根据文件后缀识别并设置正确的image/gif作为Content-Type,因此不存在这个问题。
另外需要注意:使用预签名URL上传时,PUT请求的头字段必须和生成预签名URL时传入的签名参数完全一致,任何字符差异都会触发签名校验失败返回403。这次能正常上传成功,说明生成预签名URL环节配置的Content-Type也同样多写了末尾的句号,两边参数错误一致才绕过了签名校验。
修复方案
- 修正预签名URL生成逻辑中的Content-Type参数,去掉末尾多余的英文句号,确保传入值为标准的
image/gif - 修正前端PUT上传请求的请求头配置,同样将Content-Type设置为无多余字符的
image/gif,保证和生成签名时的参数完全匹配 - 重新生成预签名URL后再次上传,文件即可被S3正常识别为GIF类型
存量已上传的异常文件无需重新上传,直接在S3控制台选中对应文件,通过「操作-编辑元数据」菜单手动将Content-Type修改为
image/gif保存即可修复显示问题。
内容的提问来源于stack exchange,提问作者user19473296
相关产品推荐
相关产品推荐

