2012-11-08 6 views
11

私はダーツスクリプトでファイルをアップロードする例を探しています。ダーツでファイルをアップロードするには?

ファイル入力フィールドで選択した後でクライアント側で読むことについては分かりますが、サーバーにPOSTしてファイルとして保存するにはどうすればよいですか?

+1

我々はかなりマルチパートのためのパーサを必要としますエンコーディング。今週末、私が家に帰ると、今日でも1つ書くことができます。 –

答えて

11

マルチパートエンコーディングパーサーが利用可能になるまで、クライアント上でFile APIを使用して、ファイルの内容を読み込み、アップロードすることができます。dataUrl。このAPIは、ブラウザで非常によくサポートされています(http://caniuse.com/filereader参照)。クライアント側では

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

参考文献:

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

とサーバ側の

+0

Alexandreに感謝します。しかし、base64の文字列をデコードし、Dartのファイルに保存する方法を知っていますか? PHPの代替base64_decodeを探していた –

+0

ダーツでファイルを書き込むには、http://www.dartlang.org/articles/io/をご覧ください。 Base64は例のためだけでした。しかし残念ながら、base64ToBytesはダーツでは使用できません(http://dartbug.com/2458)。あなたの周りを回避するには、おそらく 'reader.readAsText(file)'や 'reader.readAsBinaryString(file)'を ' reader.readAsDataURL(ファイル) ' –

+0

アレクサンドルの助けをいただきありがとうございます。私は、datauriとbase64用のサーバー側で独自のデコーダを開発しました。これは素晴らしいことですが、いつかそれを共有しようとします。 –

関連する問題