2009-10-25 2 views
7

Je suis à la recherche d'un exemple de code de téléchargement de fichier/exemple dans Silverlight. Après avoir fait des recherches, j'ai trouvé de nombreux contrôles/projets, mais tous étaient assez complexes; supportant le chargement de plusieurs fichiers, la progression du téléchargement de fichiers, le rééchantillonnage d'images et beaucoup de classes.Très simple Exemple de téléchargement de fichier Silverlight

Je suis à la recherche du scénario le plus simple possible avec un code court, propre et facile à comprendre.

Répondre

13

Ce code est assez court et (espérons) facile à comprendre:

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

Pour une solution complète téléchargeable voir mon blog à ce sujet: File Upload in Silverlight - a Simple Solution

+0

Merci pour le lien! – JohnC

+2

Pour le bénéfice de quiconque regarde cette réponse à l'avenir, UploadFileAsync ou UploadDataAsync serait probablement plus approprié ici. OpenWriteAsync est idéal pour écrire un flux, mais il ne prend pas un tableau d'octets comme fileContent comme argument et le télécharge. OpenWriteCompletedEventHandler signifie "La vapeur est maintenant prête pour l'écriture" plutôt que "Le téléchargement est terminé". –

+1

Merci de noter, je n'étais pas au courant de UploadFileAsync. J'ai fait un peu de recherche et je suis tombé sur le fait qu'il n'était pas supporté par SL2 ... Je vais vérifier s'il est supporté par la version 3 et mettre à jour le code en conséquence. –

Questions connexes