解决方法
这段代码非常简短(希望)易于理解:
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,1); // append } else { return; // Upload finished } byte[] fileContent = new byte[CHUNK_SIZE]; _data.Read(fileContent,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,bytesRead); outputStream.Close(); if (_bytesUploaded < _bytesTotal) { UploadFileChunk(); } else { // Upload complete } } }
有关完整的可下载解决方案,请参阅我的博文:File Upload in Silverlight – a Simple Solution