Загрузите и сохраните изображение по URL-адресу универсальное приложение для Windows

Я использую приведенный ниже код, чтобы загрузить изображение с удаленного 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;
        }

Этот код работает у меня в большинстве случаев, но я заметил, что для некоторых изображений изображение не загружается полностью.

Я вызываю эту функцию в асинхронном блоке для получения более 100 изображений за один проход внутри цикла foreach, и в конце концов некоторые из них не загружаются.

[Либо я вижу, что создается недопустимый файл

или только часть изображения при загрузке, а в остальной области я вижу блок черного цвета [похоже, изображение повреждено].

Размер всех изображений только менее 1 МБ

Может ли кто-нибудь помочь мне оптимизировать этот код или указать на ошибку в коде, чтобы я мог полностью загрузить все изображения


person Sebastian    schedule 05.01.2016    source источник
comment
Ваш код выглядит нормально -_-   -  person kiewic    schedule 07.01.2016
comment
Есть идеи, почему изображения не загружаются полностью? Есть ли влияние ограничения памяти? Нужно ли мне читать ответ как байты данных? Или возможны какие-то улучшения в этом коде?   -  person Sebastian    schedule 07.01.2016
comment
@kiewic Можете ли вы увидеть опубликованный ответ и какие-либо комментарии по этому поводу?   -  person Sebastian    schedule 07.01.2016
comment
У меня это сработало stackoverflow.com/questions/26958829/   -  person Cloy    schedule 06.01.2017


Ответы (3)


Я не вижу ошибок в своем коде. Но после того, как я попробовал несколько разных способов загрузки и сохранения файла, мой код выглядит так:

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

И этот код работает нормально, не вызывая никаких проблем. Все изображения загружаются полностью, и больше нет проблем с черным блоком на изображениях.

Если кто-то может указать на разницу с моим первым кодом, будет действительно полезно понять причину ошибки.

person Sebastian    schedule 07.01.2016
comment
Теперь вы используете HttpClient вместо HttpWebRequest. - person Ask Too Much; 09.01.2016
comment
ДА . И с помощью этого фрагмента кода моя проблема решена. Но все же я хочу знать, как HttpClient влияет на WebRequest, если кто-то может объяснить - person Sebastian; 11.01.2016
comment
Я не знаю, чем HttpClient занимаются внутри компании, но проверяли ли вы видео по ссылке CH9, которую я указал в своем ответе? Они объясняют, почему следует использовать его вместо старого. - person Ask Too Much; 11.01.2016

Вы пробовали использовать новый Windows.Web.Http.HttpClient вместо HttpWebRequest?

Также взгляните на этот вопрос SO: Как использовать новый HttpClient из Windows.Web.Http для загрузки изображения?

Если вы не знакомы с HttpClient, советую посмотреть презентацию CH9: https://channel9.msdn.com/Events/Build/2013/4-092

person Ask Too Much    schedule 05.01.2016
comment
Я проверил это и увидел, что в потоке они конвертируются в BitmapImage, и я пытаюсь сохранить поток в файл. Я думаю, что это проблема с чтением как кусков, поэтому при сохранении изображения ничего не потеряно. Любая помощь будет заметна для этого. Тем не менее я борюсь - person Sebastian; 05.01.2016
comment
Вы загружаете изображения одновременно? Или по одному изображению за раз? - person Ask Too Much; 05.01.2016
comment
По одному, и даже если его не существует - person Sebastian; 05.01.2016
comment
НЕТ Все мои загрузки в порядке, никаких исключений я не получаю. Только очень немногие изображения выглядят поврежденными [идеальная только часть изображения] - person Sebastian; 05.01.2016

Я попробовал вашу загрузку и столкнулся с теми же проблемами.

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();
person sonicbabbler    schedule 02.09.2020