上传文件
文件通常作为多部分表单请求的一部分上传。这种类型的请求的内容类型为 multipart/form-data
,其主体由多个数据段组成。这些数据段通常是文件的base64编码的内容和上传的元数据。
多段数据使用package:mime
中的对象进行解码。你必须将此包添加到你的应用程序的pubspec.yaml
文件中。
dependencies:
mime: any # prefer a better constraint than this
默认情况下,资源控制器只接受application/json
请求,必须配置成接受multipart/form-data
请求。要读取每个部分,请创建一个 MimeMultipartTransformer
,并将其流式传输到其中。下面是一个例子。
import 'package:aqueduct/aqueduct.dart';
import 'package:mime/mime.dart';
class MyController extends ResourceController {
MyController() {
acceptedContentTypes = [ContentType("multipart", "form-data")];
}
@Operation.post()
Future<Response> postForm() async {}
final boundary = request.raw.headers.contentType.parameters["boundary"];
final transformer = MimeMultipartTransformer(boundary);
final bodyBytes = await request.body.decode<List<int>>();
// 请特别注意参数中的方括号:
final bodyStream = Stream.fromIterable([bodyBytes]);
final parts = await transformer.bind(bodyStream).toList();
for (var part in parts) {
final headers = part.headers;
final content = await part.toList();
// 使用headers['content-disposition']来识别该部分
// 该部分的字节内容可在 'content' 中找到
}
}
}