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(); } }
关键说明
- 避免手动读取原始内容:
HttpRequest的multipart属性会自动解析请求的multipart结构,拆分出文本字段和文件部分,无需自己处理边界和二进制数据。 - 区分文本与文件:通过
part.isText判断当前部分是文本字段还是文件,文本字段用utf8.decodeStream读取内容,文件则直接通过管道写入本地文件。 - 错误处理:包裹try-catch捕获解析过程中的异常,返回合适的HTTP状态码。
推荐工具包
如果觉得原生处理流程偏繁琐,可以使用第三方包简化开发:
shelf_multipart:配合shelf轻量级Web框架使用,提供更简洁的multipart解析API,适合快速搭建服务端。multipart:独立的multipart解析库,可直接处理原始请求流,适合不依赖框架的场景。
内容的提问来源于stack exchange,提问作者Sittiphan Sittisak
相关产品推荐
相关产品推荐

