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

Flutter Retrofit多文件上传报415不支持媒体类型问题求助

解决Flutter Retrofit Multipart上传图片415错误问题

核心问题分析

你遇到的415错误,本质是后端无法识别请求中的文件MediaType。虽然手动指定了contentType,但直接传递File类型时,Retrofit可能没有正确处理文件的元信息(比如文件名、准确的Content-Type),导致后端无法匹配允许的文件类型。而Postman能成功,是因为它自动帮你设置了正确的文件名和对应的Content-Type。

解决方案

1. 改用MultipartFile替代File作为接口参数

修改你的Retrofit接口定义,将参数类型从File改为MultipartFile:

@POST("apiUrl/upload/files")
@MultiPart()
Future<TSSuccessResponse<UploadFileRemoteResponse>> uploadFile(
    @Part() MultipartFile file,
);

2. 创建MultipartFile时指定准确的元信息

调用接口前,通过MultipartFile.fromFile方法创建实例,手动指定带正确后缀的文件名和匹配文件实际类型的Content-Type:

// 先导入path包:import 'package:path/path.dart';
final multipartFile = await MultipartFile.fromFile(
  imagePath,
  // 保留原文件名后缀,后端可能通过后缀辅助校验类型
  filename: basename(imagePath),
  // 根据文件实际类型设置,比如png用image/png,jpg用image/jpeg
  contentType: MediaType('image', 'png'),
);

// 调用上传接口
final response = await yourApiService.uploadFile(multipartFile);

3. 核对Postman请求细节

打开Postman的请求详情,确认以下内容和代码一致:

  • Form-data中的参数key是否和接口的@Part()参数名(此处为file)完全匹配
  • Postman中文件的Content-Type值,确保代码中设置的类型和它一致
  • 请求头是否为multipart/form-data; boundary=xxx(Retrofit会自动处理,可做确认)

为什么之前的方法无效?

  • 直接传递File类型时,Retrofit默认会将Content-Type设为application/octet-stream,即使在@Part中指定contentType,也可能因File类型的处理逻辑不生效
  • 后端可能同时校验Content-Type和文件名后缀,缺少正确的后缀会导致校验失败

内容的提问来源于stack exchange,提问作者Naufal Rajabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:01:28