Invalid Zip File -ZipArchive

67 Views Asked by At

I am trying to create a zip file from a byte[] and return the zip file as a byte[] also but when I upload the bytes to blob storage, the zip file is invalid when I download it.

Code:

byte[] zipBytes;
using (var zipMemoryStream = new MemoryStream())
{
    using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create, true))
    {
        var zipExcelEntry = archive.CreateEntry(
           $"SAR-{subjectAccessRequest.Basic.FirstName}-{subjectAccessRequest.Basic.LastName}_{DateTime.Now:yyyyMMddHHmmss}.xlsx",
           CompressionLevel.Fastest);

        using (var excelEntryFile = zipExcelEntry.Open()) excelEntryFile.Write(stream.ToArray(), 0, (int)stream.Length);

        zipBytes = zipMemoryStream.ToArray();

    };
};

return zipBytes;

Am I doing anything obviously wrong here when creating the zip file?

The code for uploading to blob storage is already tried and tested code so the problem should lie here

1

There are 1 best solutions below

1
On BEST ANSWER

You need to close archive before you ToArray the stream.

You should also use CopyTo on the inner file stream.

using var zipMemoryStream = new MemoryStream();

using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create, true))
{
    var zipExcelEntry = archive.CreateEntry(
           $"SAR-{subjectAccessRequest.Basic.FirstName}-{subjectAccessRequest.Basic.LastName}_{DateTime.Now:yyyyMMddHHmmss}.xlsx",
           CompressionLevel.Fastest);

    using (var excelEntryFile = zipExcelEntry.Open())
        stream.CopyTo(excelEntryFile);
};
var zipBytes = zipMemoryStream.ToArray();
return zipBytes;

Ideally you would just return the whole zipped stream rather than creating a new byte array, as this is more efficient.

var zipMemoryStream = new MemoryStream();

using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create, true))
{
    var zipExcelEntry = archive.CreateEntry(
           $"SAR-{subjectAccessRequest.Basic.FirstName}-{subjectAccessRequest.Basic.LastName}_{DateTime.Now:yyyyMMddHHmmss}.xlsx",
           CompressionLevel.Fastest);

    using (var excelEntryFile = zipExcelEntry.Open())
        stream.CopyTo(excelEntryFile);
};

zipMemoryStream.Position = 0;  // reset position to beginning
return zipMemoryStream;