Дарт, как загрузить изображение

Я пытаюсь загрузить изображение, вот код:

server.dart

import 'dart:io';

void main() {
  HttpServer.bind('127.0.0.1', 8080)
    .then((HttpServer server) {
      server.listen((HttpRequest request) {
        if (request.method.toLowerCase() == 'post') {
          request.fold(new BytesBuilder(), (builder, data) => builder..add(data))
          .then((BytesBuilder builder) {
            File file = new File('abc.jpg');
            file.writeAsBytes(builder.takeBytes(), mode: FileMode.WRITE)
              .then((_) {
                request.response.close();
              });
          });
        } else {
          File f = new File('test_1.html')
              ..openRead().pipe(request.response);
        }
      });
    });
}

test_1.html

<!DOCTYPE html>

<html>
  <head>
    <title>test_1</title>
  </head>

  <body>
    <form method="post" enctype="multipart/form-data">
      <input id="fileupload" name="myfile" type="file" placeholder="some file here..."/>
      <input type="submit" />
    </form>
  </body>
</html>

Затем я попытался открыть вновь сохраненное изображение с помощью программы просмотра фотографий win, но там написано "не поддерживает этот формат файла", в то время как я вижу содержимое исходного файла. Так что я предполагаю, что я не использую правильный метод для декодирования байтов (возможно, просто предположение).

Ребята, вы можете дать мне подсказку?

Извините за плохой английский.

1 ответ

Решение

На стороне сервера вы сохраняете тело вашего HTTP-запроса, содержащего многокомпонентную информацию. Попробуйте открыть сохраненный файл в текстовом редакторе, вы увидите что-то вроде:

------WebKitFormBoundaryOTIF23kDCYaWAAlc
Content-Disposition: form-data; name="myfile"; filename="photo.jpeg"
Content-Type: image/jpeg

<FF><D8><FF><E0>^@^PJFIF^@^A^A^@^@^A^@^A^......
------WebKitFormBoundaryOTIF23kDCYaWAAlc--

Вам нужно проанализировать тело запроса для получения реального содержимого загруженного файла. Вы можете сделать это с помощью пакета http_server:

import 'dart:io';
import 'package:http_server/http_server.dart';

void main() {
  HttpServer.bind('127.0.0.1', 8080)
    .then((HttpServer server) {
      server.listen((HttpRequest request) {
        if (request.method.toLowerCase() == 'post') {
          HttpBodyHandler.processRequest(request).then((body) {
            HttpBodyFileUpload fileUploaded = body.body['myfile'];
            final file = new File('abc.jpg');
            file.writeAsBytes(fileUploaded.content, mode: FileMode.WRITE)
              .then((_) {
                request.response.close();
              });
          });
        } else {
          File f = new File('upload.html')
              ..openRead().pipe(request.response);
        }
      });
    });
}
Другие вопросы по тегам