2009-10-25 18 views
7

मैं सिल्वरलाइट में एक बहुत ही उदाहरण फ़ाइल अपलोड कोड स्निपलेट/समाधान की तलाश में हूं। खोज करने के बाद मुझे कई नियंत्रण/परियोजनाएं मिली हैं लेकिन उनमें से सभी काफी जटिल थे; एकाधिक फ़ाइल अपलोड का समर्थन, फ़ाइल अपलोड प्रगति, छवि पुनः नमूनाकरण और कई कक्षाएं।बहुत सरल सिल्वरलाइट फ़ाइल उदाहरण उदाहरण

मैं संक्षिप्त, साफ और समझने में आसान कोड के साथ सबसे सरल संभव परिदृश्य की तलाश में हूं।

उत्तर

13

इस कोड को बहुत कम है और समझने के लिए (उम्मीद) आसान:

public const int CHUNK_SIZE = 4096; 
public const string UPLOAD_URI = "http://localhost:55087/FileUpload.ashx?filename={0}&append={1}"; 
private Stream _data; 
private string _fileName; 
private long 
_bytesTotal; 
private long _bytesUploaded; 
private void UploadFileChunk() 
{ 
    string uploadUri = ""; // Format the upload URI according to wether the it's the first chunk of the file 
    if (_bytesUploaded == 0) 
    { 
     uploadUri = String.Format(UPLOAD_URI,_fileName,0); // Dont't append 
    } 
    else if (_bytesUploaded < _bytesTotal) 
    { 
     uploadUri = String.Format(UPLOAD_URI, _fileName, 1); // append 
    } 
    else 
    { 
     return; // Upload finished 
    } 

    byte[] fileContent = new byte[CHUNK_SIZE]; 
    _data.Read(fileContent, 0, CHUNK_SIZE); 

    WebClient wc = new WebClient(); 
    wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted); 
    Uri u = new Uri(uploadUri); 
    wc.OpenWriteAsync(u, null, fileContent); 
    _bytesUploaded += fileContent.Length; 
} 

void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) 
{ 
    if (e.Error == null) 
    { 
     object[] objArr = e.UserState as object[]; 
     byte[] fileContent = objArr[0] as byte[]; 
     int bytesRead = Convert.ToInt32(objArr[1]); 
     Stream outputStream = e.Result; 
     outputStream.Write(fileContent, 0, bytesRead); 
     outputStream.Close(); 
     if (_bytesUploaded < _bytesTotal) 
     { 
      UploadFileChunk(); 
     } 
     else 
     { 
      // Upload complete 
     } 
    } 
} 

एक पूरा डाउनलोड करने योग्य समाधान के लिए इस पर मेरे ब्लॉग पोस्ट देखें: इस परियोजना http://simpleuploader.codeplex.com/ बाहर File Upload in Silverlight - a Simple Solution

+0

लिंक के लिए धन्यवाद! – JohnC

+2

भविष्य में इस उत्तर को देखने वाले किसी के भी लाभ के लिए, अपलोडफाइलएसिंक या अपलोडडाटाएसिंक शायद यहां अधिक उपयुक्त होगा। OpenWriteAsync एक स्ट्रीम लिखने के लिए बहुत अच्छा है, लेकिन यह एक बाइट सरणी नहीं लेता है जैसे फ़ाइल सामग्री एक तर्क के रूप में और इसे अपलोड करें। OpenWriteCompletedEventHandler का अर्थ है "अपलोड पूर्ण हो गया है" के बजाय "भाप अब लिखने के लिए तैयार है"। –

+1

नोटिंग के लिए धन्यवाद, मुझे UploadFileAsync से अवगत नहीं था। मैंने थोड़ी सी खोज की है और यह आया है कि यह SL2 में समर्थित नहीं था ... मैं देखता हूं कि यह संस्करण 3 में समर्थित है और उसके अनुसार कोड अपडेट करें। –

2

चेक। यह आपको कोड की बहुत कम लाइनों के साथ अपने सर्वर पर कई फाइलें अपलोड करने की अनुमति देता है।

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