图片上传后点链接变成下载,响应头 Content-Type 是 application/octet-stream。文件本身能正常打开,只是浏览器不预览。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,上传时没有指定 ContentType,服务端按默认值落库。有些 SDK 方法不会自动嗅探扩展名,流式上传尤其明显。元数据只在写入时设置,事后修改要单独发一次复制请求。

「Content-Type 元数据丢失」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。改完顺手把文档补一句,省得下次自己重新推一遍。

aws s3api put-object --bucket b --key a.jpg --body a.jpg --content-type image/jpeg
aws s3api copy-object --bucket b --key a.jpg --copy-source b/a.jpg \
--metadata-directive REPLACE --content-type image/jpeg

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,上传时按扩展名显式设置 ContentType;流式上传手动传 ContentType 参数;存量对象用 copy-object 加 REPLACE 批量修;确认 Content-Disposition 没有强制 attachment。

最后用这个标准收尾,浏览器打开链接直接预览图片,响应头 Content-Type 为 image/jpeg。

作者 9823189