2012-06-27 35 views
0

我試圖從互聯網上通過URL將圖像下載到我的Windows8應用程序並將其轉換爲字節[]。 (BitmapImage是不可序列化的)從互聯網下載圖像並將其轉換爲WinRT中的byte []

不幸的是,當我嘗試處理此代碼時,由於Stream不可搜索,它在bytearray初始化時崩潰。

有沒有辦法做到這一點?我有紅,有沒有流仍然是在WinRT中可搜索...

private async Task<byte[]> DownloadImageFromWebsite(string url) 
     { 
      //BitmapImage result = null; 
      byte[] result = null; 

      try 
      { 
       HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 

       WebResponse response = await request.GetResponseAsync(); 

       Stream imageStream = response.GetResponseStream(); 
       result = new byte[imageStream.Length]; 
       await imageStream.ReadAsync(result, 0, (int)imageStream.Length); 


       response.Dispose(); 
      } 
      catch (Exception ex) 
      { 
       return null; 
      } 

      return result; 
     } 
+0

而不是嘗試一次讀取所有數據,您可以讀取固定大小的塊並使用[MemoryStream](http://msdn.microsoft.com/zh-cn/library/system .io.memorystream.aspx),這是可擴展的。 (也就是說,我不太瞭解這將如何與異步功能進行交互。) – millimoose

回答

3

你的問題是這樣的一行:

result = new byte[imageStream.Length]; 

HTTP響應流,你不知道它有多大才會被閱讀。

如果服務器發送一個Content-Length標題,那麼您應該可以讀取它並使用它來調整您的數組大小。但是,您仍然必須回到將整個流(未知大小)讀入內存中,因此:

private async Task<byte[]> DownloadImageFromWebsiteAsync(string url) 
{ 
    try 
    { 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
    using (WebResponse response = await request.GetResponseAsync()) 
    using (var result = new MemoryStream()) 
    { 
     await imageStream.CopyToAsync(result); 
     return result.ToArray(); 
    } 
    } 
    catch (WebException ex) 
    { 
    return null; 
    } 
} 

P.S.我建議你使用HttpClient而不是HttpWebRequest

相關問題