2009-10-25 10 views
7

Poszukuję przykładowego fragmentu kodu/pliku do przesłania pliku w Silverlight. Po przeszukaniu znalazłem wiele kontroli/projektów, ale wszystkie były dość skomplikowane; obsługa przesyłania wielu plików, postępu przesyłania plików, ponownego pobierania próbek obrazów i wielu zajęć.Bardzo prosty przykład ładowania pliku Silverlight

Szukam najprostszego możliwego scenariusza z krótkim, czystym i łatwym do zrozumienia kodem.

Odpowiedz

13

Kod ten jest dość krótka i (miejmy nadzieję) jest łatwy do zrozumienia:

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

Dla kompletnego rozwiązania do pobrania zobaczyć mojego blogu na ten temat: File Upload in Silverlight - a Simple Solution

+0

Dzięki za link! – JohnC

+2

Dla dobra każdej osoby, która przyjrzy się tej odpowiedzi w przyszłości, właściwsze będzie UploadFileAsync lub UploadDataAsync. OpenWriteAsync świetnie nadaje się do pisania strumienia, ale nie pobiera tablicy bajtów, takich jak fileContent, jako argumentu i nie przesyła go. OpenWriteCompletedEventHandler oznacza "Para jest teraz gotowa do zapisu", a nie "Przesyłanie zakończone". –

+1

Dzięki za uwagę, nie wiedziałem o UploadFileAsync. Zrobiłem trochę wyszukiwania i natknąłem się na to, że nie było obsługiwane w SL2 ... Sprawdzę, czy jest ono obsługiwane w wersji 3 i odpowiednio zaktualizuje kod. –