Как я могу записать загруженные многочастные файлы на диск? - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь обработать загрузку файлов через многочастные запросы с помощью Aqueduct.Акведук теперь имеет пример того, как обрабатывать многокомпонентные запросы:

https://aqueduct.io/docs/http/request_and_response/#example-multipartform-data

В этом примере объясняется, как получить заголовок и содержимое файлов.Однако это не объясняет, как записать содержимое в файл на диске.

Как записать содержимое файлов, загруженных на диск?

Ниже приведен пример, который показывает, чего я хочу достичь, но не работает:

import 'dart:io';

import 'package:aqueduct/aqueduct.dart';
import 'package:mime/mime.dart';

class MediaUploadController extends ResourceController {
  MediaUploadController() {
    acceptedContentTypes = [ContentType("multipart", "form-data")];
  }

  @Operation.post()
  Future<Response> postMultipartForm() async {
    final transformer = MimeMultipartTransformer(request.raw.headers.contentType.parameters["boundary"]);
    final bodyStream = Stream.fromIterable([await request.body.decode<List<int>>()]);
    final parts = await transformer.bind(bodyStream).toList();

    for (var part in parts) {
      final String contentType = part.headers["content-type"];

      // Write content to disk
      final content = await part.toList();

      final fileName = DateTime.now().millisecondsSinceEpoch.toString() + ".jpg";
      var file = new File('data/' + fileName);
      var sink = file.openWrite();
      sink.write(content);
      sink.close();
    }

    return new Response.ok({});   
  }
}

1 Ответ

0 голосов
/ 05 марта 2019

Это ниже на самом деле работает.В дополнение к пакету mime я также добавил пакет http_server в pubspec.yaml, поскольку он упрощает обработку данных многоэлементной формы.

dependencies:
  aqueduct: ^3.0.1
  mime: ^0.9.6+2
  http_server: ^0.9.8+1

Затем я изучил некоторые другие платформы, чтобы увидеть, как они обрабатываютсязапись в файл.Это так сложно понять, как этот составной материал и потоки работают вместе.Но, наконец, спустя почти неделю, свет в конце туннеля ... пока не появятся следующие вопросы.Скорее всего, через 10 минут:)

import 'dart:io';

import 'package:aqueduct/aqueduct.dart';
import 'package:mime/mime.dart';
import 'package:http_server/http_server.dart';

class MediaUploadController extends ResourceController {
  MediaUploadController() {
    acceptedContentTypes = [ContentType("multipart", "form-data")];
  }

  @Operation.post()
  Future<Response> postMultipartForm() async {
    final transformer = MimeMultipartTransformer(request.raw.headers.contentType.parameters["boundary"]);
    final bodyStream = Stream.fromIterable([await request.body.decode<List<int>>()]);
    final parts = await transformer.bind(bodyStream).toList();

    for (var part in parts) {
      HttpMultipartFormData multipart = HttpMultipartFormData.parse(part);

      final ContentType contentType = multipart.contentType;

      final content = multipart.cast<List<int>>();

      final filePath = "data/" + DateTime.now().millisecondsSinceEpoch.toString() + ".jpg";

      IOSink sink = File(filePath).openWrite();
      await for (List<int> item in content) {
        sink.add(item);
      }
      await sink.flush();
      await sink.close();
    }

    return new Response.ok({});   
  }
}
...