Compresser le fichier avec dotnetzip, et quand il est ouvert, il est corrompu

Je crée un fichier zip dans un contrôleur à partir d’un tableau d’octets et je renvoie le fichier zip en tant que résultat de fichier. Lorsque je télécharge le fichier zip et que je l’extrais, il est corrompu. Je le fais de cette façon:

byte[] fileBytes =array MemoryStream fileStream = new MemoryStream(fileBytes); MemoryStream outputStream = new MemoryStream(); fileStream.Seek(0, SeekOrigin.Begin); using (ZipFile zipFile = new ZipFile()) { zipFile.AddEntry(returnFileName, fileStream); zipFile.Save(outputStream); } outputStream.Position = 0; FileStreamResult fileResult = new FileStreamResult(outputStream, System.Net.Mime.MediaTypeNames.Application.Zip); fileResult.FileDownloadName = returnFileName + ".zip"; return fileResult; 

Vous pourriez être malchanceux de bash l’un des bogues ouverts dans DotNetZip . Il existe par exemple un problème en fonction de la taille du fichier ( https://dotnetzip.codeplex.com/workitem/14087 ).

Malheureusement, DotNetZip a des problèmes critiques et le projet ne semble plus être activement maintenu. Une meilleure alternative serait d’utiliser SharpZipLib (si vous vous conformez à leur licence basée sur la GPL), ou l’un des ports .NET de zlib .

Si vous êtes sur .NET 4.5, vous pouvez utiliser les classes intégrées de l’espace de noms System.IO.Compression . Vous trouverez l’exemple suivant dans la documentation de la classe ZipArchive :

 using System; using System.IO; using System.IO.Compression; namespace ConsoleApplication { class Program { static void Main(ssortingng[] args) { using (var zipToOpen = new FileStream(@"c:\tmp\release.zip", FileMode.Open)) { using (var archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update)) { var readmeEntry = archive.CreateEntry("Readme.txt"); using (var writer = new StreamWriter(readmeEntry.Open())) { writer.WriteLine("Information about this package."); writer.WriteLine("========================"); } } } } } } 
 public class HomeController : Controller { public FileResult Index() { FileStreamResult fileResult = new FileStreamResult(GetZippedStream(), System.Net.Mime.MediaTypeNames.Application.Zip); fileResult.FileDownloadName = "result" + ".zip"; return fileResult; } private static Stream GetZippedStream() { byte[] fileBytes = Encoding.ASCII.GetBytes("abc"); ssortingng returnFileName = "something"; MemoryStream fileStream = new MemoryStream(fileBytes); MemoryStream resultStream = new MemoryStream(); using (ZipFile zipFile = new ZipFile()) { zipFile.AddEntry(returnFileName, fileStream); zipFile.Save(resultStream); } resultStream.Position = 0; return resultStream; } }