如何在Flutter中用Retrofit上传动态数量的List<File>多文件
Flutter Retrofit 动态多文件上传实现方案
1. 修改Retrofit接口定义
把原来的单文件参数替换成接收List<MultipartFile>的参数,两种写法都能正常适配多文件上传场景:
写法一(使用@PartList注解):
@POST('/store') @MultiPart() Future<dynamic> store({ @Part() required String title, @PartList() required List<MultipartFile> files, });
写法二(直接用@Part):
@POST('/store') @MultiPart() Future<dynamic> store({ @Part() required String title, @Part() required List<MultipartFile> files, });
两种写法都会自动生成符合多文件上传要求的表单字段,适配绝大多数后端接收逻辑。
2. 转换文件类型
Retrofit仅支持MultipartFile类型的文件上传,所以需要将你手中的List<File>批量转换成该类型,用MultipartFile.fromFile方法处理即可:
// 假设这是你动态获取到的文件列表 List<File> yourFileList = []; // 批量转换为Retrofit支持的类型 List<MultipartFile> uploadFiles = await Future.wait( yourFileList.map((file) async => MultipartFile.fromFile( file.path, filename: file.path.split('/').last, // 可选,自定义上传的文件名 )), );
3. 调用接口完成上传
直接把转换后的文件列表传入接口方法即可:
await yourApiInstance.store( title: "测试标题", files: uploadFiles, );
注意事项
- 提前确认后端接收参数的名称:如果后端文件参数名不是
files,可以在@Part里指定name属性,比如@Part(name: "attachments") required List<MultipartFile> files。 - 极少场景下后端要求每个文件参数名单独命名(比如
file1、file2),这种情况可以手动构建List<Part>逐个指定参数名,但绝大多数业务场景用上面的方法就足够。
内容的提问来源于stack exchange,提问作者genericUser
相关产品推荐
相关产品推荐

