我正在尝试通过网址将图像从网上下载到我的Windows8应用程序并将其转换为字节[]。 (BitmapImage不可序列化)
不幸的是,当我尝试处理这段代码时,它会因为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 :(得分: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
。