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

Dart服务端如何接收Postman发送的form-data数据?

在Dart服务端处理multipart/form-data请求(含文件上传)

直接读取原始请求内容会触发解析错误,原因是multipart/form-data包含文本字段、二进制文件内容以及分隔边界,手动解析极易出错。Dart的dart:io本身就提供了内置的multipart解析能力,无需手动处理原始数据,以下是实现示例:

原生dart:io实现代码

import 'dart:io';
import 'dart:convert';

void main() async {
  // 启动HTTP服务,监听8080端口
  final server = await HttpServer.bind(InternetAddress.anyIPv4, 8080);
  print('服务已启动,监听端口: 8080');

  // 处理每个请求
  await for (final request in server) {
    // 只处理POST类型的multipart/form-data请求
    if (request.method == 'POST' && 
        request.headers.contentType?.mimeType == 'multipart/form-data') {
      try {
        // 遍历所有multipart部分
        await for (final part in request.multipart) {
          if (part.isText) {
            // 解析文本字段
            final fieldValue = await utf8.decodeStream(part);
            print('文本字段 ${part.name} 的值: $fieldValue');
          } else {
            // 处理上传的文件
            final savePath = './uploads/${part.filename ?? 'unknown_file'}';
            final targetFile = File(savePath);
            // 确保上传目录存在
            await targetFile.parent.create(recursive: true);
            // 将文件流写入本地
            await part.pipe(targetFile.openWrite());
            print('文件 ${part.filename} 已保存至: $savePath');
          }
        }
        // 返回成功响应
        request.response
          ..statusCode = HttpStatus.ok
          ..write('form-data解析完成');
      } catch (e) {
        print('解析出错: $e');
        request.response
          ..statusCode = HttpStatus.badRequest
          ..write('解析form-data失败');
      }
    } else {
      // 处理不符合要求的请求
      request.response
        ..statusCode = HttpStatus.methodNotAllowed
        ..write('仅支持POST请求,且Content-Type必须为multipart/form-data');
    }
    // 关闭响应
    await request.response.close();
  }
}

关键说明

  1. 避免手动读取原始内容:HttpRequest的multipart属性会自动解析请求的multipart结构,拆分出文本字段和文件部分,无需自己处理边界和二进制数据。
  2. 区分文本与文件:通过part.isText判断当前部分是文本字段还是文件,文本字段用utf8.decodeStream读取内容,文件则直接通过管道写入本地文件。
  3. 错误处理:包裹try-catch捕获解析过程中的异常,返回合适的HTTP状态码。

推荐工具包

如果觉得原生处理流程偏繁琐,可以使用第三方包简化开发:

  • shelf_multipart:配合shelf轻量级Web框架使用,提供更简洁的multipart解析API,适合快速搭建服务端。
  • multipart:独立的multipart解析库,可直接处理原始请求流,适合不依赖框架的场景。

内容的提问来源于stack exchange,提问作者Sittiphan Sittisak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:10:30