You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:09:26