下载网址从图像并不总是保存整个图像(WinRT的)

问题描述:

我使用下面的代码从URL下载的图像下载网址从图像并不总是保存整个图像(WinRT的)

HttpClient client = new HttpClient(); 
     var stream = await client.GetStreamAsync(new Uri("<your url>")); 
     var file = await KnownFolders.PictureLibrary.CreateFileAsync("myfile.png"); 
     using (var targetStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
     { 
      using (stream) 
       await stream.CopyToAsync(targetStream.AsStreamForWrite()); 
     } 

一些用户报告说,它并不总是下载整个图像。他们有时会得到部分图像,其余的只是垃圾。

这是否有任何理由? 谢谢!

+1

你需要刷新/关闭/处理目标流/文件吗? – 2013-03-11 14:49:24

+0

我不确定。我认为使用块将为我照顾。但我会试一试。不幸的是,我不能重现这个问题,所以我输入的任何“修复”都将是盲目的。 刚刚意识到流不在使用块 – Smeegs 2013-03-11 14:50:44

+0

@Javalsu文档对于从Client.GetStreamAsync返回的流上的Dispose方法做了什么说明。有些流需要刷新,其他流不需要 – 2013-03-11 14:53:51

我会建议使用DownloadData或DownloadDataAsync方法尝试WebClient类。

File.WriteAllBytes("myfile.png", 
    new WebClient().DownloadData("<your url>")); 

编辑如果流是给你,你可以使用字节数组,而不是响应麻烦。您的“使用”语句与内部的异步代码可能会导致它提前处置,也许?

var httpClient = new HttpClient(); 
var data = await httpClient.GetByteArrayAsync(new Uri("<Your URI>")); 
var file = await KnownFolders.PictureLibrary.CreateFileAsync("myfile.png"); 
var targetStream = await file.OpenAsync(FileAccessMode.ReadWrite) 
await targetStream.AsStreamForWrite().WriteAsync(data, 0, data.Length); 
targetStream.FlushAsync().Wait(); 
targetStream.Close(); 
+0

感谢您的建议,但我不相信这在Winrrt中有效。 – Smeegs 2013-03-11 15:00:40

+0

@Javalsu - 我认为这个问题可能是“using”语句过早地处理对象,或者HttpClient的流/完成问题。我编辑了我的答案,以反映“可能”更稳定的解决方案。 – 2013-03-11 15:38:14

+0

感谢您的回复。迄今为止这么好,没有问题。 – Smeegs 2013-03-11 15:42:42

BackgroundDownloader是下载文件最简单的方法。

using Windows.Storage; 

public async Task DownloadPhoto(Uri uri) 
{ 
    var folder = ApplicationData.Current.LocalFolder; 
    var photoFile = await folder.CreateFileAsync("photo.jpg", CreationCollisionOption.ReplaceExisting); 
    var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader(); 
    var dl = downloader.CreateDownload(uri, photoFile); 
    await dl.StartAsync(); 
} 
+0

感谢您的建议,不幸的是我已经尝试过这种方法,它并没有为我工作。我的应用程序有很多在后台运行的进程,看起来这个方法必须等待所有其他进程结束才能启动。所以我无法使用它。 – Smeegs 2013-05-02 12:14:22

+0

即使在StartAsync()处有一个等待并且在下载功能处有一个等待处理? – akhansari 2013-05-02 13:46:59

+0

是的,这是非常令人困惑的,它会冲击等待线,永远不会进步。我开始讨论微软论坛,并就如何阻止其开始的其他进程达成共识。 我无法确认这是真正的原因,但没有任何建议可以使它工作。 – Smeegs 2013-05-02 15:11:57

如果您使用HttpClient,那么如果您的图像大于64K,则会出错。您将不得不将httpClient.MaxResponseContentBufferSize设置为更大。

请参阅MSDN快速入门,他们将max-buffer-size设置为256K。 http://msdn.microsoft.com/en-us/library/windows/apps/xaml/JJ152726(v=win.10).aspx

个人而言,我使用BackgroundDownloader。