AWS CLI S3 sync命令下载PNG图片出现损坏问题排查求助
核心原因
90%以上的概率是S3对象的Content-Encoding元数据配置错误,AWS CLI默认会自动根据该头对内容做解码处理,未压缩的图片被错误解码后就会出现体积变大、文件损坏的问题。
可行解决方案
- 临时解决单次同步问题:在
s3 sync命令后增加--no-auto-decode参数,禁用CLI的自动解码逻辑,直接拉取S3上的原始文件字节:
aws s3 sync s3://$AWS_STORAGE_BUCKET_NAME/media/filer_public/4e/79/4e7929c1-e7fa-4f39-80c8-0c958efac0d0/ . --no-auto-decode
执行后对比文件大小和MD5值,确认文件正常。
- 验证根因:执行以下命令查看对应S3对象的元数据,确认是否存在错误的
Content-Encoding配置:
aws s3api head-object --bucket $AWS_STORAGE_BUCKET_NAME --key media/filer_public/4e/79/4e7929c1-e7fa-4f39-80c8-0c958efac0d0/giraffe-cover-image_7.png
如果返回结果中存在ContentEncoding字段(如值为gzip、deflate等),且确认上传时并未对文件做对应压缩,即可确认是元数据配置错误。
- 永久修复所有客户端下载问题:修正S3对象的错误元数据,清空错误的
Content-Encoding配置:
aws s3api copy-object --bucket $AWS_STORAGE_BUCKET_NAME \ --key media/filer_public/4e/79/4e7929c1-e7fa-4f39-80c8-0c958efac0d0/giraffe-cover-image_7.png \ --copy-source $AWS_STORAGE_BUCKET_NAME/media/filer_public/4e/79/4e7929c1-e7fa-4f39-80c8-0c958efac0d0/giraffe-cover-image_7.png \ --content-encoding '' \ --metadata-directive REPLACE
如果有大量同类文件,可以批量遍历执行上述修改操作。
- 额外排查项:如果上述操作无效,可尝试升级AWS CLI到最新版本,旧版本存在过自动解码逻辑异常的已知bug。Windows用户可额外在命令中增加
--binary参数,避免换行符自动转换导致的文件损坏。
内容的提问来源于stack exchange,提问作者johan
相关产品推荐
相关产品推荐

