Flutter Dio上传多图至FastAPI仅1张成功 报MultipartFile异常
问题根因
报错核心是代码逻辑位置错误:
- 你把构建
FormData、发送上传请求的逻辑写在了遍历图片的for循环内部,每遍历到1张图片就会发1次上传请求 - 存储
MultipartFile的_images是循环外的持久化列表,每次循环都会往列表里追加新的文件对象,但不会移除之前已经上传过的对象 MultipartFile本质是对文件读取流的包装,一旦被请求序列化消费完成后就会被标记为finalized,无法二次复用
第一次循环时,_images里只有1个新生成的MultipartFile,请求正常发送、后端成功存入1张图片,这个文件对象也被标记为已finalize。第二次循环时,你往列表里加了第二张图,但列表里同时还存在第一次已经用过的已finalize文件对象,Dio在构建请求尝试finalize所有文件时,碰到已经完结的旧对象就会直接抛出你看到的异常。
修复方案
直接把请求逻辑移到循环外,先遍历完所有待上传图片生成全部MultipartFile实例,再一次性构建FormData发送请求即可,修复后的代码如下:
_uploadImage() async { // 先清空历史残留的文件对象,避免带入之前上传过的已finalize实例 _images?.clear(); // 第一步:遍历所有选中图片,生成全部待上传的MultipartFile for (int i = 0; i < imageFileList!.length; i++) { var path = imageFileList![i].path; _images!.add(await MultipartFile.fromFile( path, filename: path.split('/').last, // 可根据实际图片格式调整contentType,避免后端识别类型异常 // contentType: MediaType("image", "jpeg") )); } // 第二步:所有文件准备完成后,仅构建一次FormData,同时传入业务字段和全部文件 var formData = FormData.fromMap( { "name": _pNameC.text, "price": _pPriceC.text, "description": _pDescriptionC.text, "files": _images, }, ); // 第三步:仅发送一次请求,完成所有数据上传 var response = await DioClient.dio.post( "http://10.0.2.2:8000/products/addProductFD", data: formData, options: Options( contentType: 'multipart/form-data', followRedirects: false, validateStatus: (status) { return status! < 500; }, ), ); debugPrint(response.toString()); }
补充说明
- 上述写法适配FastAPI后端
files: List[UploadFile] = File(...)形式的多文件参数,后端可一次性解析到所有上传的图片,不需要循环发多次请求 - 如果业务要求必须单张循环上传,每次循环时需要新建临时列表存储当前批次的MultipartFile,不要往全局
_images列表里累加对象,避免将已finalize的旧文件带入下一次请求
内容的提问来源于stack exchange,提问作者pythonGo
相关产品推荐
相关产品推荐

