7

我正在使用以下代码从 url 下载图像

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());
        }

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

这有什么原因吗?谢谢!

4

3 回答 3

7

我建议使用 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();
于 2013-03-11T14:55:19.857 回答
3

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();
}
于 2013-05-02T09:03:38.193 回答
1

如果您使用 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。

于 2013-05-06T21:38:09.440 回答