2009-10-25 15 views
7

Estoy buscando un snipplet/solución de código de carga de ejemplo en Silverlight. Una vez realizada la búsqueda, he encontrado numerosos controles/proyectos, pero todos eran bastante complejos; soporta carga de archivos múltiples, progreso de carga de archivos, re-muestreo de imágenes y muchas clases.Ejemplo de carga de archivos de Silverlight muy simple

Estoy buscando el escenario más simple posible con un código corto, limpio y fácil de entender.

Respuesta

13

Este código es bastante corto y (con suerte) fácil de entender:

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

Para una solución completa descargable ver a mi blog el siguiente: File Upload in Silverlight - a Simple Solution

+0

¡Gracias por el enlace! – JohnC

+2

Para el beneficio de cualquiera que mire esta respuesta en el futuro, UploadFileAsync o UploadDataAsync probablemente serían más apropiados aquí. OpenWriteAsync es ideal para escribir una secuencia, pero no toma una matriz de bytes como fileContent como argumento y lo sube. OpenWriteCompletedEventHandler significa "El vapor ahora está listo para escribir" en lugar de "La carga está completa". –

+1

Gracias por tomar nota, no estaba al tanto de UploadFileAsync. Hice un poco de búsqueda y encontré que no era compatible con SL2 ... Voy a ver si es compatible con la versión 3 y actualizar el código en consecuencia. –