【问题标题】:Dart how to upload imageDart如何上传图片
【发布时间】:2013-08-26 02:49:01
【问题描述】:

我正在尝试上传图片,这是代码:

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 照片查看器打开新保存的图像,但它说“不支持此文件格式”,而我可以看到原始图像的内容。所以我猜我没有使用正确的方法来解码字节(也许,只是一个猜测)。

你们能给我一个提示吗?

抱歉英语不好。

【问题讨论】:

    标签: dart dart-io


    【解决方案1】:

    在服务器端,您正在保存包含 multipart 信息的 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 package 做到这一点:

    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);
            }
          });
        });
    }
    

    【讨论】:

    • 谢谢,这行得通。顺便说一句,该软件包是否有任何文档?还是我应该只阅读单元测试?
    • Dart API Reference 上应该有文档。请file an issue。同时你可以直接在http_body.dart的来源阅读文档。
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2010-11-22
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多