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

使用Retrofit2向AspNet Core6传PNG图片时出现400错误求助

Retrofit2上传PNG到AspNet Core 6出现400 Bad Request排查方案

以下是针对该错误的常见排查方向及解决方法:

  • DTO字段与命名不匹配
    Android端和服务器端的UploadDTO字段名称、类型必须严格一致(AspNet Core默认区分大小写,除非额外配置)。
    示例:
    Android端DTO(Java):

    public class UploadDTO {
        @SerializedName("FileName") // 若服务器用 PascalCase,需显式指定
        private String fileName;
        @SerializedName("Image")
        private RequestBody image;
        // Getter/Setter 方法
    }
    

    服务器端DTO(C#):

    public class UploadDTO {
        public string FileName { get; set; }
        public IFormFile Image { get; set; }
    }
    

    注意:如果Android使用Gson序列化,若服务器采用小写驼峰命名,需确保DTO字段名一致,或通过@SerializedName映射;AspNet Core可通过配置JsonOptions统一命名规则,或用[JsonPropertyName]标注字段。

  • 请求Content-Type与注解错误
    Retrofit上传文件必须使用multipart/form-data格式,接口定义需正确标注:

    @Multipart
    @POST("api/upload")
    Call<ResponseBody> uploadImage(@Part MultipartBody.Part image, @Part("FileName") RequestBody fileName);
    

    服务器端Action必须添加[FromForm]注解,以接收表单格式的multipart数据:

    [HttpPost("api/upload")]
    public IActionResult Upload([FromForm] UploadDTO dto) {
        // 业务逻辑
    }
    

    错误场景:Retrofit用@Body代替@Multipart,或服务器未加[FromForm],都会直接返回400。

  • 文件参数名不匹配
    Retrofit中@Part的名称必须与服务器DTO中IFormFile字段名完全一致。比如服务器字段为Image,Retrofit构造请求时需指定对应名称:

    RequestBody imageBody = RequestBody.create(MediaType.parse("image/png"), file);
    MultipartBody.Part imagePart = MultipartBody.Part.createFormData("Image", file.getName(), imageBody);
    
  • PNG文件有效性与大小限制

    • 检查上传的PNG文件是否损坏,无效格式会导致服务器解析失败。
    • AspNet Core默认限制请求大小,若文件超出阈值会返回400。可在Program.cs中调整限制:
      builder.Services.Configure<FormOptions>(options => {
          options.MultipartBodyLengthLimit = 10 * 1024 * 1024; // 设置为10MB
      });
      
  • 服务器端模型验证失败
    若UploadDTO添加了数据验证注解(如[Required]),Android端未传递必填参数会触发400。示例:

    public class UploadDTO {
        [Required(ErrorMessage = "文件名不能为空")]
        public string FileName { get; set; }
        [Required]
        public IFormFile Image { get; set; }
    }
    

    可通过查看服务器日志获取具体验证失败信息,确保Android端传递所有必填参数。

  • Retrofit请求体构造错误
    确保文件RequestBody的MediaType设置为image/png,避免因类型不匹配被服务器拒绝:

    RequestBody imageBody = RequestBody.create(MediaType.parse("image/png"), file);
    

内容的提问来源于stack exchange,提问作者Владислав Мельник

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:35:54