2012-11-08 18 views
11

मैं एक डार्ट स्क्रिप्ट के साथ फ़ाइल अपलोड करने के किसी भी उदाहरण को खोजने का प्रयास कर रहा हूं।डार्ट में फ़ाइल कैसे अपलोड करें?

मैं फ़ाइल इनपुट फ़ील्ड में चुने जाने के बाद क्लाइंट पक्ष पर इसे पढ़ने के बारे में समझता हूं, लेकिन मैं इसे सर्वर पर कैसे पोस्ट कर सकता हूं और इसे फ़ाइल के रूप में सहेज सकता हूं?

+1

हम काफी बहुखण्डीय के लिए एक पार्सर की जरूरत है एन्कोडिंग। मैं इस सप्ताह के अंत में एक लिख सकता हूं, शायद आज भी जब मैं घर जाऊं। –

उत्तर

11

एक मल्टीपार्ट एन्कोडिंग पार्सर उपलब्ध होने तक, आप के रूप में फ़ाइल सामग्री को पढ़ने और अपलोड करने के लिए क्लाइंट पर File 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); 
    }); 
} 

संदर्भ:

+0

धन्यवाद अलेक्जेंड्रे, हालांकि क्या आप बेस 64 स्ट्रिंग को डीकोड करने और इसे डार्ट में फ़ाइल में सहेजने के बारे में जानते हैं? php वैकल्पिक base64_decode –

+0

की तलाश में जा रहा है डार्ट में एक फ़ाइल लिखने के लिए, आप http://www.dartlang.org/articles/io/ पर एक नज़र डाल सकते हैं। बेस 64 केवल उदाहरण के लिए था। लेकिन दुर्भाग्यवश, बेस 64ToBytes इस समय के लिए डार्ट में उपलब्ध नहीं है (http://dartbug.com/2458) आप के आसपास काम करने के लिए शायद 'reader.readAsText (फ़ाइल) 'या' reader.readAsBinaryString (फ़ाइल)' का उपयोग ' reader.readAsDataURL (फाइल) '। –

+0

आपकी सहायता अलेक्जेंड्रे के लिए धन्यवाद, मैंने डेटाौरी और बेस 64 के लिए सर्वर पक्ष पर अपना खुद का डिकोडर विकसित किया, और यह बहुत अच्छा काम कर रहा है, मैं इसे कभी साझा करने की कोशिश करूंगा। –

संबंधित मुद्दे