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
Merci pour le lien! – JohnC
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é". –
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. –