如何通过Dio在JSON对象的NewDocuments中发送非Base64格式文件?
解决Dio发送嵌套数组内MultipartFile的问题
要实现你需要的嵌套结构请求,核心是利用multipart/form-data的字段命名约定来模拟JSON嵌套,具体做法是给字段名加上数组下标和层级标识,后端框架(比如Spring、Laravel等)通常都能自动解析这种格式。
直接上可行的代码示例:
// 假设你已经获取了图片的bytes、文件名和媒体类型 final bytes = await File('path/to/your/image').readAsBytes(); const fileName = 'test.jpg'; const mediaType = MediaType('image', 'jpeg'); // 创建FormData对象 final formData = FormData(); // 添加嵌套数组里的id字段,格式为 数组名[索引][字段名] formData.fields.add(MapEntry('NewDocuments[0][id]', '1')); // 添加嵌套数组里的图片文件,字段名同样遵循层级格式 formData.files.add(MapEntry( 'NewDocuments[0][document]', MultipartFile.fromBytes( bytes, filename: fileName, contentType: mediaType, ), )); // 用Dio发送POST请求 final dio = Dio(); final response = await dio.post( 'your-api-url', data: formData, );
如果需要发送多个文档,只需要递增数组下标即可:
// 第二个文档 formData.fields.add(MapEntry('NewDocuments[1][id]', '2')); formData.files.add(MapEntry( 'NewDocuments[1][document]', MultipartFile.fromBytes( anotherBytes, filename: 'another.jpg', contentType: MediaType('image', 'jpeg'), ), ));
原理说明:multipart/form-data本身是扁平的键值对结构,没有原生的嵌套数组支持,所以通过NewDocuments[0][id]这种命名方式,告诉后端这是NewDocuments数组第0个元素的id字段,后端会自动把这些字段映射回你需要的嵌套JSON结构。
内容的提问来源于stack exchange,提问作者Bear
相关产品推荐
相关产品推荐

