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
相关产品推荐
相关产品推荐

