C# 从internet下载图像并在WinRT中将其转换为字节[]
我正在尝试通过URL从internet下载图像到Windows8应用程序,并将其转换为字节[]。(BitmapImage不可序列化) 不幸的是,当我试图处理这段代码时,它在bytearray初始化时崩溃,因为流不可查找 有没有办法做到这一点?我知道在温特还没有一条可以看到的小溪C# 从internet下载图像并在WinRT中将其转换为字节[],c#,wpf,windows-runtime,C#,Wpf,Windows Runtime,我正在尝试通过URL从internet下载图像到Windows8应用程序,并将其转换为字节[]。(BitmapImage不可序列化) 不幸的是,当我试图处理这段代码时,它在bytearray初始化时崩溃,因为流不可查找 有没有办法做到这一点?我知道在温特还没有一条可以看到的小溪 private async Task<byte[]> DownloadImageFromWebsite(string url) { //BitmapImage resu
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;
}
私有异步任务下载ImageFromWeb(字符串url)
{
//BitmapImage结果=空;
字节[]结果=空;
尝试
{
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(url);
WebResponse=wait request.GetResponseAsync();
Stream imageStream=response.GetResponseStream();
结果=新字节[imageStream.Length];
等待imageStream.ReadAsync(结果为0,(int)imageStream.Length);
response.Dispose();
}
捕获(例外情况除外)
{
返回null;
}
返回结果;
}
您的问题是这一行:
result = new byte[imageStream.Length];
对于HTTP响应流,在读取之前,您不知道它会有多大
如果服务器发送一个内容长度
头,那么您应该能够读取它并使用它调整数组大小。但是,您仍然需要返回到将整个流(大小未知)读取到内存中,例如:
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;
}
}
私有异步任务下载ImagefromWebSiteAsync(字符串url)
{
尝试
{
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(url);
使用(WebResponse=await request.GetResponseAsync())
使用(var result=new MemoryStream())
{
等待imageStream.CopyToAsync(结果);
返回result.ToArray();
}
}
捕获(WebException ex)
{
返回null;
}
}
另外,我建议您使用而不是
HttpWebRequest
您的问题是这一行:
result = new byte[imageStream.Length];
对于HTTP响应流,在读取之前,您不知道它会有多大
如果服务器发送一个内容长度
头,那么您应该能够读取它并使用它调整数组大小。但是,您仍然需要返回到将整个流(大小未知)读取到内存中,例如:
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;
}
}
私有异步任务下载ImagefromWebSiteAsync(字符串url)
{
尝试
{
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(url);
使用(WebResponse=await request.GetResponseAsync())
使用(var result=new MemoryStream())
{
等待imageStream.CopyToAsync(结果);
返回result.ToArray();
}
}
捕获(WebException ex)
{
返回null;
}
}
另外,我建议您使用而不是
HttpWebRequest
,而不是尝试一次读取所有数据,您可以在固定大小的块中读取数据,并使用可扩展的。(也就是说,我真的不明白这将如何与异步功能交互。)与其尝试一次读取所有数据,您可以在固定大小的块中读取数据,并使用可扩展的。(也就是说,我真的不明白这将如何与异步功能交互。)