记录OSS上传压缩包的一个坑
分享一下OSS上传遇到一个坑,希望可以给读者一些参考
背景
某系统需要上传文件功能,采用前端直传的模式,该功能支持jpg、jpeg、png、pdf、docx、rar、zip格式的文件上传,然而上线后,业务反馈rar、zip压缩包上传在获取token的时候报错。
报错如下:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Invalid according to Policy: Policy Condition failed: ["eq", "$Content-Type", "application/x-rar"]</Message>
<RequestId>68FB2A61BA68BD36329xxxxx</RequestId>
<HostId>hr-contract.oss-cn-hangzhou.aliyuncs.com</HostId>
<ExecCondition>["eq", "application/octet-stream", "application/x-rar"]</ExecCondition>
<EC>0006-00000227</EC>
<RecommendDoc>https://api.aliyun.com/troubleshoot?q=0006-00000227</RecommendDoc>
</Error>
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Invalid according to Policy: Policy Condition failed: ["eq", "$Content-Type", "application/zip"]</Message>
<RequestId>68FB2A61BA68BD36329E1EF6</RequestId>
<HostId>hr-contract.oss-cn-hangzhou.aliyuncs.com</HostId>
<ExecCondition>["eq", "application/x-zip-compressed", "application/zip"]</ExecCondition>
<EC>0006-00000227</EC>
<RecommendDoc>https://api.aliyun.com/troubleshoot?q=0006-00000227</RecommendDoc>
</Error>
问题定位
从错误中看,其实是token中指定的MIME类型(application/x-rar、application/zip)与浏览器识别的MIME类型(application/octet-stream、application/x-zip-compressed)不一致,而代码中又采用的是MatchMode.EXACT 校验模式。
上线前后在自己设备(mac)上测试,都是没有问题可以上传的。很奇怪业务设备(windows)为什么会报错,问了一下ai,了解到:

查看业务浏览器,与自己设备都是一样的Chrome,版本也一致,基本排除旧版浏览器导致的。至此,问题确定,根本原因是操作系统差异导致的 MIME 类型识别不同。
解决方案
针对压缩文件,不采用 MatchMode.EXACT 转而采用 MatchMode.StartWith 模式,只校验开头就行了,因为开头都是 application/

浙公网安备 33010602011771号