Возвращение zip-файла из веб-интерфейса - PullRequest
0 голосов
/ 14 октября 2019

Я построил веб-интерфейс asp net. Мне нужно вернуть zip-файл в результате некоторой внутренней логики. Я использую этот код, и он работает, но полученный zip-файл, разархивированный вручную, дал мне эту ошибку «Есть данные после окончания полезной нагрузки»

 using (ZipFile zip = new ZipFile())
 {
     ...
     zip.Save(di.FullName + "\\" + "Update.zip");
 }


 string path = Path.Combine(Properties.Settings.Default.PathDisposizioniHTML, "Update.zip");

 var response = new HttpResponseMessage(HttpStatusCode.OK);
 var stream = new System.IO.FileStream(path, System.IO.FileMode.Open);
 response.Content = new StreamContent(stream);
 response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");

Вот так я получаюданные в консольном приложении .net:

using (Stream output = File.OpenWrite(@"C:\prova\MyFile.zip"))
    using (Stream input = httpResponse.GetResponseStream())
    {
        input.CopyTo(output);
    }

1 Ответ

0 голосов
/ 14 октября 2019

Если у вас уже есть zip-файл в вашей системе, вам не нужно делать что-то особенное перед отправкой в ​​качестве ответа.

Это должно работать:

string filePath = @"C:\myfolder\myfile.zip";

return File(filePath, "application/zip");

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

public IActionResult GetZipFile(){

   //location of the file you want to compress
   string filePath = @"C:\myfolder\myfile.ext";

   //name of the zip file you will be creating
   string zipFileName = "zipFile.zip";

   byte[] result;


   using (MemoryStream zipArchiveMemoryStream = new MemoryStream())
   {
       using (ZipArchive zipArchive = new ZipArchive(zipArchiveMemoryStream, ZipArchiveMode.Create, true))
       {
           ZipArchiveEntry zipEntry = zipArchive.CreateEntry(zipFileName);
           using (Stream entryStream = zipEntry.Open())
           {
               using (MemoryStream tmpMemory = new MemoryStream(System.IO.File.ReadAllBytes(filePath)))
               {
                    tmpMemory.CopyTo(entryStream);
                };
           }
       }

       zipArchiveMemoryStream.Seek(0, SeekOrigin.Begin);
       result = zipArchiveMemoryStream.ToArray();
   }

   return File(result, "application/zip", zipFileName);

}

Это взято из недавнего проекта ASP.NETмоего собственного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...