【问题标题】:Dart file upload: Larger files aren't uploaded completelyDart 文件上传:较大的文件没有完全上传
【发布时间】:2016-07-06 18:07:50
【问题描述】:

我用 dart 实现了一个文件上传。 这是我的客户所做的:

Future upload(String url, File file){
    Completer completer = new Completer();
    FileReader fileReader = new FileReader();
    fileReader.onLoad.listen((e){
      HttpRequest request = new HttpRequest();
      Map<String,String> headers = createHeaders();
      request.open('POST',url);
      for(String key in headers.keys){
        request.setRequestHeader(key,headers[key]);
      }
      request.send(fileReader.result);
    });
    fileReader.onLoadEnd.listen((e)=>completer.complete());
    fileReader.readAsArrayBuffer(file);
    return completer.future;
  }

这就是服务器所做的:

 Future saveFileContent(String fileId,   HttpRequest request)async{
    Completer completer = new Completer();
    File file = new File('${pathResolver.files}/${fileId}');
    await file.create(recursive: true);
    request.listen((data){
      file.writeAsBytesSync(data);
    },onDone: (){
      completer.complete();
    });
    return completer.future;
  }

对于小文件,一切正常,但是当我尝试上传更大的文件时,我的测试用例中大约 20MB,服务器上只保存了一些 MB。有人知道所有这些字节在哪里丢失了吗?

【问题讨论】:

  • 看看服务器上的request.listen() 是否在某个时候抛出错误可能会很有趣。尝试在那里添加一个 onError 处理程序。客户端也一样:尝试处理 fileReader.onError
  • 一个好主意,但未命中错误处理程序

标签: web server dart


【解决方案1】:

writeAsByteSync 将截断任何现有文件,因此实际上最后收到的数据将被写入,之前收到的数据将被删除。您可以尝试先创建文件,然后将参数mode: FileMode.APPEND 用于writeAsByteSync

【讨论】:

  • 非常感谢,这就是问题所在
猜你喜欢
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多