【问题标题】:How to upload a file in Dart?如何在 Dart 中上传文件?
【发布时间】:2012-11-08 21:29:39
【问题描述】:

我正在尝试查找使用 Dart 脚本上传文件的任何示例。

我了解在文件输入字段中选择后在客户端读取它的部分,但是如何将其发布到服务器并将其保存为文件?

【问题讨论】:

  • 我们非常需要一个用于多部分编码的解析器。这个周末我可以写一篇,甚至今天我回家的时候也可以。

标签: file-upload dart


【解决方案1】:

在多部分编码解析器可用之前,您可以在客户端使用File API 以dataUrl 读取和上传文件内容。该 API 在浏览器中的支持非常好(参见http://caniuse.com/filereader)。

在客户端:

import 'dart:html';

main() {
  InputElement uploadInput = query('#upload');
  uploadInput.onChange.listen((e) {
    // read file content as dataURL
    final files = uploadInput.files;
    if (files.length == 1) {
      final file = files[0];
      final reader = new FileReader();
      reader.onLoad.listen((e) {
        sendDatas(reader.result);
      });
      reader.readAsDataUrl(file);
    }
  });
}

/// send data to server
sendDatas(dynamic data) {
  final req = new HttpRequest();
  req.onReadyStateChange.listen((Event e) {
    if (req.readyState == HttpRequest.DONE &&
        (req.status == 200 || req.status == 0)) {
      window.alert("upload complete");
    }
  });
  req.open("POST", "http://127.0.0.1:8080/upload");
  req.send(data);
}

在服务器端:

import 'dart:io';

main() {
  final server = new HttpServer();
  server.listen('127.0.0.1', 8080);
  server.addRequestHandler((request) => request.path == '/upload' 
      && request.method.toLowerCase() == 'post'
      , (HttpRequest request, HttpResponse response) {
    _readBody(request, (body) {

      // handle your dataURL
      // example with image : data:image/jpeg;base64,/9j/4S2YRXhpZgAATU0AK... 

      // return result
      response.statusCode = HttpStatus.CREATED;
      response.contentLength = 0;
      response.outputStream.close();
    });
  });
}

/// Read body of [request] and call [handleBody] when complete.
_readBody(HttpRequest request, void handleBody(String body)) {
  String bodyString = ""; // request body byte data
  final completer = new Completer();
  final sis = new StringInputStream(request.inputStream, Encoding.UTF_8);
  sis.onData = (){
    bodyString = bodyString.concat(sis.read());
  };
  sis.onClosed = () {
    completer.complete("");
  };
  sis.onError = (Exception e) {
    print('exeption occured : ${e.toString()}');
  };
  // process the request and send a response
  completer.future.then((_){
    handleBody(bodyString);
  });
}

参考资料:

【讨论】:

  • 谢谢 Alexandre,但是您知道如何解码 base64 字符串并将其保存到 Dart 中的文件吗?一直在寻找php替代base64_decode
  • 要在 dart 中写入文件,您可以查看 dartlang.org/articles/io 。 Base64 仅用于示例。但不幸的是,base64ToBytes 目前在 dart 中不可用(dartbug.com/2458)要解决这个问题,您也许可以使用reader.readAsText(file) 或reader.readAsBinaryString(file) 而不是reader.readAsDataURL(file)。
  • 感谢 Alexandre 的帮助,我在服务器端为 datauri 和 base64 开发了自己的解码器,效果很好,有时间我会尝试分享。
  • 这还是要走的路吗?复制粘贴代码,但是貌似无法导入类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2022-01-21
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多