Android使用Retrofit多文件上传报IllegalArgumentException异常求助
问题定位
你遇到的崩溃是Retrofit注解使用不符合规范导致的,和PHP后端逻辑无关,触发原因是FileUploadService接口的第二个参数@Part List<MultipartBody.Part> file不满足Retrofit的@Part注解校验规则:
Retrofit对
@Part的校验逻辑:
- 修饰
RequestBody类型参数时,必须在注解中显式指定表单字段名- 修饰单个
MultipartBody.Part类型参数时,不需要指定字段名(Part对象自身已经携带字段名)- 低版本Retrofit(2.1.0以下)不支持直接用
@Part修饰List<MultipartBody.Part>集合类型,会直接抛出你看到的参数校验异常
修复方案
1. 修改接口定义(最直接,无需升级依赖版本)
把第二个参数改成可变参数形式,Retrofit对可变参数形式的多Part支持是全版本兼容的:
public interface FileUploadService { @Multipart @POST("MultiPartUpload.php") Call<ResponseBody> upload( @Part("description") RequestBody description, @Part MultipartBody.Part... files ); }
对应调用上传的位置,把存储Part的List转成数组传入即可:
// 替换原代码里的client.upload(description,parts); Call<ResponseBody> call = client.upload(description, parts.toArray(new MultipartBody.Part[0]));
2. 可选:清理冗余代码
你当前上传方法里重复创建了Retrofit实例,ServiceGenerator.createService(FileUploadService.class)生成的service没有被实际使用,后续手动构建的Retrofit实例没有配置自定义OkHttpClient,容易出现超时、请求日志缺失问题,建议统一用ServiceGenerator生成的service发起请求,删掉重复的Retrofit构建逻辑。
PHP端适配提示
你当前客户端给文件设置的表单名是file0/file1/file2这类序号格式,PHP后端不能用固定的$_FILES['file']获取文件,需要遍历$_FILES集合读取所有上传文件。
内容的提问来源于stack exchange,提问作者Seife
相关产品推荐
相关产品推荐

