2016-07-06 31 views
0

ダーツでファイルアップロードを実装しました。 これは私のクライアントが何をするかです:ダーツファイルのアップロード:大きいファイルが完全にアップロードされていません

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

で20メガバイトについて、すべてが正常に動作しますが、私は大きなファイルをアップロードしようとすると、私のテストケースは、ちょうどいくつかのMBがサーバーに保存されています。それらのバイトがすべて失われたアイデアはありますか?

+0

とすると、サーバー上の 'request.listen()'がある時点でエラーをスローするのが面白いかもしれません。そこにonErrorハンドラを追加してみてください。クライアント側でも同じです: 'fileReader.onError'を試してみてください – filiph

+0

エラーハンドラ以外の良いアイデアがヒットしました – Ced

答えて

3

writeAsByteSyncは、実際に受信した最後のデータが書き込まれ、以前に受信されたデータが消去されるため、既存のファイルを切り捨てます。最初にファイルを作成してからパラメータmode: FileMode.APPENDを使用してwriteAsByteSync

+0

ありがとうございました – Ced

関連する問題