项目场景:
在安卓App有上传文件,文件接口是项目统一的。
问题描述:
提示:这里描述项目中遇到的问题:
安卓App内上传10M以下(只测试了10M左右的图片文件)图片文件可以正常上传,而超过10M就会抛出异常,用PostMan测试文件上传接口,一切正常!!!!!
原因分析:
1、partCount
异常抛出位置是 uploadId == null 条件内,我以为是partCount 异常导致的,因为抛异常的文件的 partCount=4 ,不会抛异常的文件的partCount = 1 ,结果不然,此属性是计算文件需要上传的次数。
2、Content-Type
继续往下追源码,发现底层是用的OkHttpClient。
继续往下走发现,请求居然是400
#报错:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidRequest</Code>
<Message>Invalid Request</Message>
<Resource>/volunteer/2021/11/01/b4907d4a285946a8b38a10a99a45ffd8.jpg</Resource>
<RequestId></RequestId>
<HostId>f09dba8f-a590-40e3-aef5-397f294a3f83</HostId>
</Error>
Response{protocol=http/1.1, code=400, message=Bad Request, url=http://192.168.0.130:9000/volunteer/2021/11/01/b4907d4a285946a8b38a10a99a45ffd8.jpg?uploads=}
#
然后发现正常的文件请求和异常问文件请求的不同是没有携带upload参数,随后更换大文件发现此参数和异常并无关系。
最后,抓了4 次请求,得到了最后的结果。
# 40M 视频 —— PostMan测试,结果正常
Request{
method=POST,
url=http://192.168.0.130:9000/volunteer/2021/11/01/d4dafc44df444c23a19b053bca7c9da4.mp4?uploads=,
headers=[
Content-Type:video/mp4,
Host:192.168.0.130:9000,
Accept-Encoding:identity,
User-Agent:MinIO (Windows 10; amd64) minio-java/8.3.0,
Content-MD5:1B2M2Y8AsgTpgAmY7PhCfg==,
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,
x-amz-date:20211101T133019Z]}
# 11M 图片 —— PostMan测试,结果正常
Request{method=PUT,
url=http://192.168.0.130:9000/volunteer/2021/11/01/4059780b5773416b9001e152e8160157.jpg,
headers=[Content-Type:image/jpeg,
Host:192.168.0.130:9000,
Accept-Encoding:identity,
User-Agent:MinIO (Windows 10; amd64) minio-java/8.3.0,
Content-MD5:4mhgCUf0NDWO1JvO6hT4SQ==,
x-amz-content-sha256:84958bb071116dc16a102e84ffc3d12dc4f29fb9ce487170a3ae0588ab608c47,
x-amz-date:20211101T133354Z]}
# 11M 图片 —— APP 测试,结果异常
Request{method=POST,
url=http://192.168.0.130:9000/volunteer/2021/11/01/77e484b6bb804535acad6cbb152d7b26.jpg?uploads=,
headers=[
Content-Type:multipart/form-data,
Host:192.168.0.130:9000,
Accept-Encoding:identity,
User-Agent:MinIO (Windows 10; amd64) minio-java/8.3.0,
Content-MD5:1B2M2Y8AsgTpgAmY7PhCfg==,
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,
x-amz-date:20211101T133642Z]}
# 5M 图片 —— APP 测试,结果正常
Request{method=PUT,
url=http://192.168.0.130:9000/volunteer/2021/11/01/1e5eaf7b7371447e905eaf4da096219f.jpg,
headers=[
Content-Type:multipart/form-data,
Host:192.168.0.130:9000,
Accept-Encoding:identity,
User-Agent:MinIO (Windows 10; amd64) minio-java/8.3.0, Content-MD5:LpgQJj5+50uPkurKKHHuNg==,
x-amz-content-sha256:787b50c87e92a99a86c84b053ce95d51d2dd9142dad8fe5460ad540607be12bc,
x-amz-date:20211101T134659Z]}
最后,定位问题在 请求头:Content-Type上,让安卓那边改掉请求头后,结果反馈正常。
MinioClient 在上传文件时,会根据文件的大小计算上传的次数,如果文件需要分批上传,则是使用Post请求,文件只需要一次上传,则使用Put请求。