2009-10-25 37 views
7

Tôi đang tìm một đoạn mã/giải pháp tải lên tệp rất mẫu trong Silverlight. Đã thực hiện tìm kiếm Tôi đã tìm thấy rất nhiều điều khiển/dự án nhưng tất cả chúng đều khá phức tạp; hỗ trợ tải lên nhiều tệp, tiến trình tải lên tệp, lấy lại hình ảnh và nhiều lớp.Ví dụ tải lên tệp Silverlight rất đơn giản

Tôi đang tìm kịch bản đơn giản nhất có thể với mã ngắn, rõ ràng và dễ hiểu.

Trả lời

13

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

+0

Cảm ơn bạn đã liên kết! – JohnC

+2

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". –

+1

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. –

Các vấn đề liên quan