AWS S3 generate_presigned_post上传后Content-Type被重置的解决方法
解决S3预签名POST上传后Content-Type被重置的问题
问题原因
仅在Fields中指定Content-Type但未添加对应条件限制时,S3不会强制使用预设的Content-Type,而是采用上传请求中实际携带的文件Content-Type(未指定则默认binary/octet-stream)。
解决方案
1. 后端修改:添加Content-Type条件限制
更新boto3的generate_presigned_post调用,在Conditions参数中添加Content-Type匹配规则,让S3验证上传请求的Content-Type与预设值一致:
s3_client = boto3.client('s3') response = s3_client.generate_presigned_post( "bucket", "logo", Fields={ "Content-Type": "image/png" }, Conditions=[ {"Content-Type": "image/png"} ], ExpiresIn=3600 )
2. 前端修改:确保文件携带正确Content-Type
构建FormData时,明确指定上传文件的image/png类型:
- 若为Blob对象,创建时指定type:
const formData = new FormData(); // 先添加预签名返回的所有字段 for (const key in json.fields) { formData.append(key, json.fields[key]); } // 将图片转为指定类型的Blob后添加 const imageBlob = new Blob([image], { type: 'image/png' }); formData.append("file", imageBlob, "logo.png"); // 第三个参数为可选文件名 return fetch(json.url, { method: "POST", body: formData });
- 若为文件输入框获取的File对象,确认其
type属性为image/png,不符则转换为Blob后上传。
验证
修改后重新生成预签名参数并上传,S3会强制验证Content-Type,确保最终存储的文件Content-Type保持为image/png。
内容的提问来源于stack exchange,提问作者timborden
相关产品推荐
相关产品推荐

