C# тело ответа октет-потока API в zip-файл - PullRequest
0 голосов
/ 09 марта 2020

У меня есть служба, которая выполняет запрос к API клиента, который возвращает тело ответа октетного потока с заголовком Content-Disposition (этот API предназначен для возврата файла zip.). Я использую RestSharp и функцию DownloadData, чтобы получить ответ в виде байтового массива, но затем я хочу сохранить файл zip на локальном сервере.

Я попытался использовать DotNetZip и MemoryStream для создания файла zip используя следующий пример:

using (MemoryStream stream = new MemoryStream(fileBytes))
{
    using (ZipFile zip = new ZipFile())
    {
       zip.AddEntry("test", stream);
       zip.Save(filePath);
    }
}

Приведенный выше код создает zip-файл и запись с именем test, но я не могу ее открыть. Просто чтобы уточнить, почтовый файл, который я пытаюсь создать, содержит следующие файлы и папки:

  • 296927a0-5ac7-4ccd-9928-bd74ef7ae68a_20200227074457 (папка Root)
    • images (папка)
      • jpg изображение
      • jpg изображение
      • jpg изображение
    • подробности. json (файл)
    • достижения. json (файл)
    • оценка. json (файл)

Есть ли способ достичь этого?

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Как я понял, fileBytes уже является байтовым потоком zip-файла, что означает, что вам не нужно снова его архивировать. Просто сохраните как файл.

File.WriteAllBytes(filePath, fileBytes);
0 голосов
/ 18 марта 2020

Для всех, кто сталкивается с этой проблемой, например, при сохранении байтового массива на диск и получении поврежденного zip-файла, я нашел ответ с помощью Дениса Третьякова.

По сути, при загрузке octet-stream, первый раздел которого посвящен структуре zip-файла. В моем случае первый раздел zip-файла был:

- c7c2ad44-881 c -47c4-89e5-323f91b75269 Content-Disposition: form-data; name = "deb08d79-372d-4de2-a684-1298f25fecd9_20200310142909.zip" Content-Type: application / octet-stream

И после этого после переноса строки появляются фактические данные для zip-файла.

В итоге я вычислил количество байтов в секции «header», преобразовав массив байтов в строку:

string stringEncodedBytes = Encoding.ASCII.GetString(response.RawBytes);

Затем, зная начальную точку данных zip-файла, нашел индекс начальная точка:

int headerSectionIndex = stringEncodedBytes.IndexOf("PK");

Как только я нашел индекс, который в моем случае всегда равен 178, я просто удалил эту часть байтового массива, а затем скопировал обрезанный байтовый массив в новый байтовый массив. и запишите его на диск:

byte[] trimmedFileBytes = new byte[response.RawBytes.Length - headerSectionIndex];
Array.Copy(response.RawBytes, headerSectionIndex, trimmedFileBytes, 0, trimmedFileBytes.Length);

File.WriteAllBytes(filePath, trimmedFileBytes);

Я бы посоветовал всем, кто борется с той же проблемой, открыть «поврежденный» zip-файл в notepad ++ и взглянуть на первый раздел, а затем определить, где находится раздел данных. zip-файла начинается.

Исходные данные zip-файла выглядят так:

Initial Zip File Data

и усеченные данные zip-файла выглядит так:

Trimmed Zip File Data

...