2013-10-11 63 views
0

我對Silverlight來說相當新穎。我正嘗試在Silverlight中下載.pdf文件(和其他一些格式)。用戶點擊一個按鈕,系統進入並獲取URI,然後顯示SaveFileDialog以獲取保存文件的位置。這裏是一個代碼片段:無法在Silverlight下載.pdf文件

WebClient wc = new WebClient(); 
wc.DownloadStringCompleted += (s, e3) => 
{ 
    if (e3.Error == null) 
    { 
     try 
     { 
      byte[] fileBytes = Encoding.UTF8.GetBytes(e3.Result); 
      using (Stream fs = (Stream)mySaveFileDialog.OpenFile()) 
      { 
       fs.Write(fileBytes, 0, fileBytes.Length); 
       fs.Close(); 

       MessageBox.Show("File successfully saved!"); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error getting result: " + ex.Message); 
     } 
    } 
    else 
    { 
     MessageBox.Show(e3.Error.Message); 
}; 

wc.DownloadStringAsync("myURI", UriKind.RelativeOrAbsolute)); 

該文件被保存成功,但它大約是原來的兩倍,並且是不可讀的。 e3.Result查看正確的大小(5Mb),但我懷疑它包含許多無關字符。 FileBytes似乎是大約兩倍(11Mb)。我想嘗試DownloadDataAsync而不是DownloadStringAsync(希望它可以解決任何編碼問題),但是Silverlight有一個非常簡化的System.Net.WebClient版本,不支持DownloadDataAsync(它不會編譯)。

我相當肯定這是一個編碼問題,但我看不出如何解決它。

+0

你爲什麼使用編碼?我認爲pdf文件是二進制文件,不應該編碼,您是否嘗試使用DownloadDataCompleted(或使用編碼編寫字符串?) – wiero

+0

DownloadDataCompleted在System.Net.WebClient的Silverlight版本中不可用。我試圖只寫字符串,但得到了很多相同的結果。 –

回答

1

PDF文件是二進制文件,不使用UTF8進行編碼。要使用Silverlight下載PDF文件,您需要使用WebClient類的方法開始下載文件的二進制數據,而不是像您所做的那樣下載DownloadStringAsync方法。

除了處理DownloadStringCompleted事件,您應該處理OpenReadCompleted事件,並將接收到的字節寫入本地PDF文件的流中。如果將AllowReadStreamBuffering設置爲true,則只有在整個文件下載完成後纔會觸發OpenReadCompleted事件,從而提供與DownloadStringCompleted相同的行爲。但是,如果文件非常大,整個PDF文件將被緩衝在內存中,這可能是個壞主意。

+0

修復了@Martin。這讓我流回來了,所以我不得不使用去\t \t \t \t \t \t \t \t \t \t \t(流FS =(流)dialog.OpenFile()){ e3.Result.CopyTo(FS); fs.Flush(); fs.Close(); MessageBox.Show(「File successfully saved!」); } –