跳转至

上传文件

文件通常作为多部分表单请求的一部分上传。这种类型的请求的内容类型为 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' 中找到
    }    
  }
}