2012-11-08 31 views
11

Tôi đang cố gắng tìm bất kỳ ví dụ nào về tải lên tệp có tập lệnh Dart.Cách tải lên tệp trong Dart?

Tôi hiểu phần đọc nó ở phía máy khách sau khi được chọn trong trường nhập tệp, nhưng làm cách nào tôi có thể gửi nó vào máy chủ và lưu nó dưới dạng tệp?

+1

Chúng tôi khá nhiều cần một cú pháp cho nhiều phần dữ liệu mã hóa. Tôi có thể viết một ngày cuối tuần này, thậm chí hôm nay khi tôi về nhà. –

Trả lời

11

Cho đến khi trình phân tích cú pháp mã hóa nhiều phần có sẵn, bạn có thể sử dụng File API trên máy khách để đọc và tải lên nội dung tệp dưới dạng dataUrl. API này có hỗ trợ khá tốt trong các trình duyệt (xem http://caniuse.com/filereader).

Về phía khách hàng:

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

Và trên phía máy chủ:

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

Tài liệu tham khảo:

+0

Cảm ơn Alexandre, tuy nhiên bạn có biết làm thế nào để giải mã chuỗi base64 và lưu nó vào tập tin trong Dart? đang tìm kiếm php thay thế base64_decode –

+0

Để viết một tập tin trong phi tiêu, bạn có thể xem tại http://www.dartlang.org/articles/io/. Base64 chỉ là ví dụ. Nhưng không may, base64ToBytes là không có sẵn trong phi tiêu cho thời điểm này (http://dartbug.com/2458) Để làm việc xung quanh bạn có lẽ có thể sử dụng 'reader.readAsText (file)' hoặc 'reader.readAsBinaryString (file)' thay vì ' reader.readAsDataURL (tệp) '. –

+0

Cảm ơn sự giúp đỡ của bạn Alexandre, tôi đã phát triển bộ giải mã của riêng tôi ở phía máy chủ cho datauri và base64, và nó hoạt động rất tốt, tôi sẽ cố gắng chia sẻ nó đôi khi. –

Các vấn đề liên quan