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

Flutter批量发送相机拍摄的File至服务器,此代码是否可行?

你的代码无法直接实现需求,存在几个关键问题:

问题分析:

  • 函数缺少async关键字:代码中使用了await,但函数定义未标记async,会直接编译报错。
  • Content-Type头设置错误:Multipart请求的Content-Type应为multipart/form-data,手动设置application/json会导致请求格式混乱,服务器无法解析。
  • 未定义body变量:obj中的body.toString()里的body无定义,运行时会抛出异常。
  • 冗余的文件字段:objFile = {'file': dataFile.toString()}完全无效,只是把File列表的字符串形式传到fields中,服务器无法解析成文件,反而干扰正常上传。
  • 文件字段名可能不符合服务器要求:循环添加文件时都用'file'作为字段名,多数服务器接收多文件时需要用'file[]'这类格式,否则可能只接收最后一个文件。
  • Token空值未处理:如果SharedPreferences中没有token,Authorization头会变成null,可能导致鉴权失败。

修正后的代码:

Future<void> addServiceGrTransaction({List<File>? dataFile}) async {
  if (dataFile == null || dataFile.isEmpty) {
    throw Exception('文件列表不能为空');
  }

  final url = '$baseUrl/add-service-gr-transaction';
  final prefs = await SharedPreferences.getInstance();
  final token = prefs.getString('token');

  if (token == null) {
    throw Exception('未获取到授权Token');
  }

  final request = http.MultipartRequest('POST', Uri.parse(url))
    ..headers['Authorization'] = token;

  // 替换成你实际需要传递的业务参数,比如原代码中未定义的body内容
  final obj = {'data': '你的业务数据内容'};
  request.fields.addAll(obj);

  // 循环添加文件,用file[]适配多数服务器的多文件接收规则
  for (final file in dataFile) {
    request.files.add(await http.MultipartFile.fromPath('file[]', file.path));
  }

  final streamedResponse = await request.send();
  final response = await http.Response.fromStream(streamedResponse);

  if (response.statusCode != 200) {
    throw Exception('上传失败,状态码:${response.statusCode},响应内容:${response.body}');
  }
}

关键说明:

  • 新增async关键字,修复异步调用的语法错误。
  • 移除错误的Content-Type头,MultipartRequest会自动生成正确的请求头。
  • 增加文件列表和Token的空值校验,提前抛出明确异常。
  • 删除无效的objFile字段,仅保留通过request.files添加文件的逻辑。
  • 文件字段名改为file[],适配多数后端框架的多文件接收逻辑(若服务器要求其他字段名,直接替换即可)。
  • 错误信息补充状态码和响应内容,便于排查问题。

内容的提问来源于stack exchange,提问作者Mifta Khussolikhin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:38:13