我使用以下代码从远程网址下载图片并保存到本地存储文件夹
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循环中单个go中有更多tahn 100个图像,最后几个是下载失败
[我可以看到一些无效文件正在创建
或仅部分图像在下载和其他区域我可以看到黑色块[看起来像图像已损坏]。
所有图像的尺寸仅小于1 MB
有人可以帮我优化这段代码或指出代码中的错误,这样我就能完全下载所有图片
答案 0 :(得分:6)
我的代码中没有看到任何错误。但在尝试了一些不同的下载和保存文件的方法之后,我的代码就像这样和
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;
}
此代码工作正常而不会导致任何问题所有图像都完全下载,不再出现黑色图像问题。
如果任何人可以指出与我的第一个代码的差异将真正有助于理解错误的原因
答案 1 :(得分:1)
您是否尝试过使用新的Windows.Web.Http.HttpClient
代替HttpWebRequest
?
另外看看这个问题: How do I use the new HttpClient from Windows.Web.Http to download an image?
如果您不熟悉HttpClient
,我会看到CH9演示文稿:
https://channel9.msdn.com/Events/Build/2013/4-092
答案 2 :(得分:0)
我尝试了您的下载并遇到了相同的问题。
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();