问题源于content-type错误、二进制流被压缩或编码、预签名url配置不当、cos特有header缺失及大文件未分段上传;需分别配置mime类型、禁用压缩、使用put直传、补全x-cos头、启用分段上传。

如果您已配置ShareX并希望将截图或文件直接上传至Amazon S3(或兼容S3协议的对象存储,如腾讯云COS),但上传后PNG等文件出现损坏、无法正常打开或链接返回空白内容,则问题通常源于上传协议、元数据设置、Content-Type声明或分段上传策略不匹配。以下是针对该问题的多种独立可行配置方案:
一、启用正确Content-Type与元数据头
ShareX默认可能未显式设置PNG文件的MIME类型,导致S3以text/plain等错误类型存储,浏览器下载时解析失败。强制指定图像类型并附加必要元数据可避免解码异常。
1、在ShareX中进入【目标】→【自定义上传目标】→【新建】
2、填写【请求URL】为S3存储桶的预签名上传端点或兼容API地址(例如:https://my-bucket.s3.us-east-1.amazonaws.com)
3、在【请求头】区域添加以下两行:
Content-Type: image/png
x-amz-meta-content-type: image/png
4、勾选【使用表单数据上传】并确保【文件表单名称】设为file
5、在【参数】中添加Key字段,值设为%y%yy%m%d%h%mi-%ra.png(确保生成唯一文件名)
二、禁用自动压缩与编码转换
ShareX在传输过程中可能对二进制文件执行隐式Base64编码或gzip压缩,而S3原生期望原始字节流。若未关闭该行为,PNG文件头(89 50 4E 47)会被破坏,造成“已损坏”现象。
1、打开ShareX主界面,点击【任务设置】→【高级】
2、取消勾选【上传前压缩图像】
3、取消勾选【上传前转换为JPEG】
4、在【图像格式】下拉菜单中明确选择【PNG】
5、进入【上传】→【高级上传设置】,将【上传方式】设为【原始二进制流】
6、确认【编码类型】为【无】,而非UTF-8或Base64
三、使用预签名URL配合PUT直传(推荐用于AWS原生S3)
绕过ShareX内置表单逻辑,改由服务端生成预签名PUT URL,使ShareX以HTTP PUT方式直接写入原始PNG字节,彻底规避表单解析与multipart边界污染风险。
1、准备一个支持AWS SDK的轻量服务(如Python Flask),响应GET /presign?filename=test.png,返回JSON:{"url":"https://my-bucket.s3.us-east-1.amazonaws.com/test.png?X-Amz-Signature=..."}
2、在ShareX【自定义上传目标】中,【请求类型】设为【PUT】
3、【请求URL】设为该服务接口,例如:https://your-api.com/presign?filename=%y%yy%m%d%h%mi-%ra.png
4、【响应类型】设为【JSON】,【URL】字段填写:{json:url}
5、【文件表单名称】留空(PUT无需表单)
6、在【请求头】中添加:Content-Type: image/png
四、适配腾讯云COS等S3兼容服务的特殊Header修正
腾讯云COS虽兼容S3 API,但在处理PUT请求时强制校验x-cos-meta-*前缀元数据,且要求x-cos-acl必须显式声明。缺失或格式错误将导致文件写入成功但内容不可读。
1、在ShareX【自定义上传目标】的【请求头】中增加:
x-cos-acl: public-read
x-cos-meta-original-filename: %f
x-cos-storage-class: STANDARD
2、确认【节点】填写为COS控制台中显示的**外网访问域名**(非内网或加速域名),例如:my-bucket-1250000000.cos.ap-guangzhou.myqcloud.com
3、在【参数】中移除所有含Signature、Policy等敏感字段的键值对(COS不接受客户端拼接策略)
4、将【请求类型】设为【PUT】,【文件表单名称】保持为空
5、在【高级上传设置】中关闭【自动添加Content-MD5头】(COS对该头校验严格,ShareX计算值易错)
五、启用分段上传并限制单段大小(适用于大于10MB的PNG)
超大PNG(如高分辨率截图导出)在单次上传中易因超时或缓冲截断导致损坏。启用分段上传可保障完整性,尤其在弱网络环境下。
1、确保ShareX版本≥14.0.0(支持分段上传开关)
2、进入【任务设置】→【上传】→【高级上传设置】
3、勾选【启用分段上传】
4、将【分段大小】设为8388608(即8MB,符合S3最小分段要求)
5、在【自定义上传目标】的【请求URL】末尾追加?uploads(触发初始化分段)
6、在【参数】中添加uploadId字段,值设为{response:uploadId}(从初始化响应中提取)
7、确认【上传方式】为【分段上传】,且【完成上传请求】URL模板包含/{uploadId}?uploadId={uploadId}










