1

我正在尝试通过 URL 从 Internet 将图像下载到我的 Windows8 应用程序并将其转换为字节 []。(BitmapImage 不可序列化)

不幸的是,当我尝试处理此代码时,它在字节数组初始化时崩溃,因为 Stream 不可搜索。

有没有办法做到这一点?我已经红了,在 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;
        }
4

1 回答 1

5

你的问题是这一行:

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;
  }
}

PS 我建议你使用HttpClient而不是HttpWebRequest.

于 2012-06-27T13:57:47.873 回答