Mã này là khá ngắn và (hy vọng) dễ hiểu:
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
}
}
}
Đối với một giải pháp có thể tải về hoàn toàn thấy bài viết trên blog của tôi về vấn đề này: File Upload in Silverlight - a Simple Solution
Nguồn
2009-10-26 00:00:25
Cảm ơn bạn đã liên kết! – JohnC
Vì lợi ích của bất kỳ ai nhìn vào câu trả lời này trong tương lai, UploadFileAsync hoặc UploadDataAsync có lẽ sẽ phù hợp hơn ở đây. OpenWriteAsync là tuyệt vời để viết một dòng, nhưng nó không lấy một mảng byte như fileContent như một đối số và tải nó lên. OpenWriteCompletedEventHandler có nghĩa là "Hơi nước bây giờ đã sẵn sàng để viết" thay vì "Tải lên hoàn tất". –
Cảm ơn bạn đã chú ý, tôi không biết về UploadFileAsync. Tôi đã thực hiện một chút tìm kiếm và đi qua rằng nó không được hỗ trợ trong SL2 ... Tôi sẽ xem xét nếu nó được hỗ trợ trong phiên bản 3 và cập nhật mã cho phù hợp. –