Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从url通用windows应用程序下载并保存图片_C#_Xaml_Uwp - Fatal编程技术网

C# 从url通用windows应用程序下载并保存图片

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

我使用下面的代码将图片下载到远程url并保存到本地存储文件夹

        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链接中的视频了吗?他们解释了为什么要使用它而不是旧的。