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

Flutter中如何通过Form-Data单Key发送多文件至REST API

Flutter 用单个Form-Data Key上传多个文件

下面提供两种常用方案,分别基于http包和dio包实现,核心都是将多个文件绑定到同一个Form-Data Key(如images[])。

方案一:使用官方http包

先确保已将http依赖添加到pubspec.yaml,再通过MultipartRequest循环把文件添加到同一Key下:

import 'package:http/http.dart' as http;
import 'dart:io';

Future<void> uploadImages(List<File> imageFiles) async {
  // 构建POST请求实例
  final request = http.MultipartRequest(
    'POST',
    Uri.parse('替换为你的API接口地址'),
  );

  // 循环添加所有图片到"images[]"这个Key
  for (final file in imageFiles) {
    request.files.add(
      await http.MultipartFile.fromPath(
        'images[]',
        file.path,
        filename: file.path.split('/').last, // 保留文件名后缀,方便后端识别类型
      ),
    );
  }

  // 可选:添加其他表单字段
  request.fields['batch_id'] = '20240520';

  // 发送请求并处理响应
  final response = await request.send();
  if (response.statusCode == 200) {
    print('上传成功');
    final responseBody = await response.stream.bytesToString();
    print('返回内容:$responseBody');
  } else {
    print('上传失败,状态码:${response.statusCode}');
  }
}

方案二:使用dio包(更简洁高效)

dio是Flutter生态中流行的网络请求库,支持更便捷的FormData构建和进度监听:

import 'package:dio/dio.dart';
import 'dart:io';

Future<void> uploadImagesWithDio(List<File> imageFiles) async {
  final dio = Dio();
  final multipartFiles = <MultipartFile>[];

  // 把本地文件转换为MultipartFile
  for (final file in imageFiles) {
    multipartFiles.add(
      await MultipartFile.fromFile(
        file.path,
        filename: file.path.split('/').last,
      ),
    );
  }

  // 构建FormData,同一个Key对应文件列表
  final formData = FormData.fromMap({
    'images[]': multipartFiles,
    'description': '批量上传的图片集', // 额外表单参数
  });

  try {
    final response = await dio.post(
      '替换为你的API接口地址',
      data: formData,
      // 可选:监听上传进度
      onSendProgress: (sent, total) {
        print('上传进度:${(sent / total * 100).toStringAsFixed(2)}%');
      },
    );
    if (response.statusCode == 200) {
      print('上传成功');
      print('返回数据:${response.data}');
    }
  } catch (e) {
    print('上传出错:$e');
  }
}

关键注意点

  • 确认后端接口支持接收同一Key下的多文件,比如PHP中可通过$_FILES['images[]']获取文件数组,Java/Spring可通过@RequestParam("images[]") List<MultipartFile>接收
  • 必须保留文件名后缀(如.jpg、.png),避免后端无法识别文件类型
  • 大文件上传建议添加进度监听,提升用户体验

内容的提问来源于stack exchange,提问作者Munsif Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:31:02