dgrs
dgrs

Reputation: 77

Zipping files and uploading to Azure Blobstorage using filestream

I am creating a website with ASP.NET Core, and I need to take a bunch of files, zip them together and then upload them to Azure Blobstorage. It succeeds, I get a downloadlink but when I download the file, I just get a "File" that I cannot open with anything.

Here's the code that handles the uploading:

            var moduleVersionReleaseFiles = _appDbContext
                .ModuleVersionReleaseFile
                .Where(x => x.ModuleVersionReleaseId == moduleVersionReleaseId)
                .ToList();

            string AzureBlobStorageConfig = _configuration["AzureBlobStorage"];
            var connectionString = _configuration["StorageConnectionString"];
            string containerName = moduleVersionReleaseId + "-" + Guid.NewGuid().ToString();

            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
            BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName.ToLowerInvariant(), Azure.Storage.Blobs.Models.PublicAccessType.BlobContainer);

            BlobClient blobClient = containerClient.GetBlobClient(moduleVersionReleaseId.ToString());

            using var stream = new MemoryStream();
            using (var archive = new ZipArchive(stream, ZipArchiveMode.Create))
            {
                foreach (var moduleVersionReleaseFile in moduleVersionReleaseFiles)
                {
                    var entry = archive.CreateEntry(moduleVersionReleaseFile.File);
                    using (var entryStream = entry.Open())
                    using (var fileStream = File.OpenRead($"{moduleVersionReleaseFile.Path}\\{moduleVersionReleaseFile.File}"))
                    {
                        await fileStream.CopyToAsync(entryStream);
                    }
                }

                stream.Position = 0;
                await blobClient.UploadAsync(stream, true);
                await stream.FlushAsync();
            }

            return blobClient.Uri.ToString();

I am using Azurite for testing, so I can't log onto the blobstorage and check there.

Why am I not getting a zip file when downloading the file as expected?

Upvotes: 0

Views: 1187

Answers (1)

Gaurav Mantri
Gaurav Mantri

Reputation: 136386

The reason you're not able to open the zip file is because it is not getting saved properly. Can you please try with the following code:

using var stream = new MemoryStream();
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create))
{
    foreach (var moduleVersionReleaseFile in moduleVersionReleaseFiles)
    {
        var entry = archive.CreateEntry(moduleVersionReleaseFile.File);
        using (var entryStream = entry.Open())
        var fileContents = File.ReadAllBytes($"{moduleVersionReleaseFile.Path}\\{moduleVersionReleaseFile.File}"));
        using (BinaryWriter zipFileBinary = new BinaryWriter(entryStream))
        {
            zipFileBinary.Write(fileContents);
        }
    }
    stream.Position = 0;
    await blobClient.UploadAsync(stream, true);
}

Upvotes: 1

Related Questions