Загрузка изображения из API приводит к повреждению изображения - PullRequest
0 голосов
/ 05 марта 2019

У меня есть такой код:

this.client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "image/png");
HttpResponseMessage response = await this.client.GetAsync("Avatar/GetImage");
Stream receiveStream = await response.Content.ReadAsStreamAsync();
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);

// Read the response data ( for filename and extension )
responseData = readStream.ReadToEnd();

switch (response.StatusCode)
{
     // Check if we are happy
     case HttpStatusCode.OK:

     StorageFolder appInstalledFolder = ApplicationData.Current.LocalFolder;

     // Just for test hardcode the filename and extension - YEAH I'M SURE THE IMAGE FROM API IS PNG
     StorageFile avatarFile = await appInstalledFolder.CreateFileAsync("Avatar.png", CreationCollisionOption.ReplaceExisting);

     try
     {
         byte[] buffer = await response.Content.ReadAsByteArrayAsync();
         using (Stream stream = await avatarFile.OpenStreamForWriteAsync())
         {
              stream.Write(buffer, 0, buffer.Length); // Save
         }
     }
     catch (Exception fileDownloadException)
     {

     }
}

Итак, проблема в том, что я получаю одинаковый размер файла, но не могу его открыть:

Я заметил, что исходное изображение было jpg, новывод PNG (API всегда возвращает PNG), но размер загруженного изображения больше исходного.

Может ли проблема быть не на моей стороне, а на стороне сервера? мой код в порядке?

ОБНОВЛЕНИЕ 1. Обнаружил проблему, но не знаю, как ее исправить.Проблема в том, что сохраненный файл содержит заголовки ответа (открыл его в Notepad ++):

Удаление: исправляет файл:

- 6e289ec9-cb9f-4621-8e5f-6affbbb67864 Длина содержимого: 2814964 Расположение содержимого: вложение;filename = "a31e3809-aeb7-43d8-b79a-10a33060aae6.png" Тип содержимого: image / png

‰ PNG

IHDR> & vњA gAMA Х8_hj ‰ cHRM ‡ Ь эЬ Y Y н8О ћ [Р4 ТiCCPPhotoshop ICC профиль XГxXX · мѓБ {вЉKdњ ^, С] vYQљT ЃҐ,ло‚TED¬XђЁ€ cБX{‹ЭcЗ®СЌI4љЮ№і.|ЯяЅя{яп іwО№чЬS~зњ;ѓaќпЁэьјЌА°$“НвЇЧЁЖ…„ЄљЯЖљА_klЦЖe5{xbятъэ:ж„~Їёyщк}±яЭХ&Кl±a“ЖґЖTшu2cXУжоћ:7KГ°sэ’lkЭxўвС°м(МheaьЖbеq[$іC¤}ЬЌ§ШМ їm?4NLIЉ‡сP4¶ъ»ГШЖ­bнг4ЋґЏНhњ‹ЦжЂdl’ЩЉaќvэDґСѕg3¦Ў_М=Щњn‰ЏЌі©"УUИ*}RдИЃЄ ›1Ю“‚ЊД”№^z_Я / ќЏ> p $ О »8» ылФЃ: -оКbС $ E№ЄTЅTЃсIЖБ * ЉМ .ОЈу! Бсю0z] joN4?[ЏЪ [dџ oЌО? ЬЧ # ЬГSзҐ

enter image description here

1 Ответ

0 голосов
/ 05 марта 2019

Можете ли вы попробовать это?Это позволит вам прочитать поток контента один раз и только один раз.(Кроме того, вы не буферизуете все изображение в памяти)

this.client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "image/png");
HttpResponseMessage response = await this.client.GetAsync("Avatar/GetImage");
using (Stream receiveStream = await response.Content.ReadAsStreamAsync())
{
    StorageFolder appInstalledFolder = ApplicationData.Current.LocalFolder;
    StorageFile avatarFile = await appInstalledFolder.CreateFileAsync("Avatar.png", CreationCollisionOption.ReplaceExisting);
    using (Stream stream = await avatarFile.OpenStreamForWriteAsync())
    {
        receiveStream.CopyTo(stream);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...