C# 从url通用windows应用程序下载并保存图片
我使用下面的代码将图片下载到远程url并保存到本地存储文件夹C# 从url通用windows应用程序下载并保存图片,c#,xaml,uwp,C#,Xaml,Uwp,我使用下面的代码将图片下载到远程url并保存到本地存储文件夹 try { var rootFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync( "MyAppName\\CoverPics", CreationCollisionOption.OpenIfExists); var coverpic_file = await rootF
try
{
var rootFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync( "MyAppName\\CoverPics", CreationCollisionOption.OpenIfExists);
var coverpic_file = await rootFolder.CreateFileAsync(filename, CreationCollisionOption.FailIfExists);
try
{
var httpWebRequest = HttpWebRequest.CreateHttp(coverUrl);
HttpWebResponse response = (HttpWebResponse)await httpWebRequest.GetResponseAsync();
Stream resStream = response.GetResponseStream();
using (var stream = await coverpic_file.OpenAsync(FileAccessMode.ReadWrite))
{
await resStream.CopyToAsync(stream.AsStreamForWrite());
}
response.Dispose();
}
catch //any exceptions happend while saving the picture
{
saved = false;
}
}
catch
{
//https://msdn.microsoft.com/en-us/library/windows/apps/br227250.aspx
//Raise an exception if file already present
saved = true;
}
这段代码在大多数情况下都适用于我,但我注意到,对于少数图片,图像没有完全下载
我在一个异步块中调用这个函数,在foreach循环中一次调用多个tahn 100图像,最后很少有失败的下载
[或者我可以看到创建了一些无效文件
或者只在下载时看到部分图像,其余区域我可以看到一个黑色的色块[看起来图像已经损坏]
所有图像的大小仅小于1 MB
有人能帮我优化这段代码或者指出代码中的错误,这样我就可以完整地下载所有图像了吗?你试过用新的
Windows.Web.Http.HttpClient
代替HttpWebRequest
再看看这个问题:
如果您不熟悉HttpClient,我建议您观看CH9演示:
我的代码中没有发现任何错误。但在尝试了一些不同的下载和保存文件的方法后,我的代码如下所示
try
{
HttpClient client = new HttpClient(); // Create HttpClient
byte[] buffer = await client.GetByteArrayAsync(coverUrl); // Download file
using (Stream stream = await coverpic_file.OpenStreamForWriteAsync())
stream.Write(buffer, 0, buffer.Length); // Save
}
catch
{
saved = false;
}
这段代码运行良好,不会引起任何问题,所有图像都已完全下载,图像上不再出现黑块问题
如果有人能指出与我的第一段代码的区别,这将有助于理解错误的原因我尝试了你的下载,也遇到了同样的问题
var myFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("MyFolderPath", CreationCollisionOption.OpenIfExists);
var myFile = await myFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(new Uri(URL), myFile);
await download.StartAsync();
我检查了它,发现在线程中他们正在转换为位图图像,我正在尝试将流保存到文件中。我认为读为块存在问题,因此在保存图像时不会丢失任何内容。这样做的任何帮助都是值得的。但我仍在苦苦挣扎,你是同时下载图像?还是一次下载一个图像?一次一个即使它不存在,我所有的下载都没问题,我也没有例外。唯一的问题是,很少有图像看起来像是损坏的[只有部分图像是完美的]你的代码看起来还可以-u-你知道为什么图像没有完全下载吗?内存限制有什么影响吗?我需要将响应读取为字节数据吗?或者这段代码可能有任何改进吗?@kiewic你能看到发布的答案和对此的任何评论吗?这对我很有效你现在使用的是HttpClient而不是HttpWebRequest是的。这段代码解决了我的问题。但我还是想知道HttpClient对WebRequest有什么影响,如果有人能解释的话。我不知道HttpClient在内部做什么,但你检查过我在回答中提供的CH9链接中的视频了吗?他们解释了为什么要使用它而不是旧的。