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
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;