如何压缩文件以压缩并上传到Azure Blob存储?

时间:2020-08-27 20:22:08

标签: c# stream zip azure-storage-blobs azure-blob-storage

我对这段代码有一个奇怪的问题,该代码基本上压缩文件(docs)并将其上传到Blob存储。

v11SDK:docs

var blockBlobClient = new BlockBlobClient(ConnectionString, ContainerName, "test-blob.zip");

// Saved zip is valid
// using (FileStream zipStream = new FileStream(@"C:\Users\artur\Desktop\test-local.zip", FileMode.OpenOrCreate))

// Uploaded zip is invalid
using (var stream = await blockBlobClient.OpenWriteAsync(true))
using (var archive  = new ZipArchive(stream, ZipArchiveMode.Create))
{
    var readmeEntry = archive .CreateEntry("Readme.txt");
    using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
    {
            writer.WriteLine("Information about this package.");
            writer.WriteLine("========================");
    }
    await stream.FlushAsync();
}

v12SDK:docs

var blobClient = new BlobClient(ConnectionString, InputContainerName, "test-blob.zip");

using var stream = new MemoryStream();
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create))
{
    var readmeEntry = archive.CreateEntry("Readme.txt");
    using StreamWriter writer = new StreamWriter(readmeEntry.Open());
    {
        writer.WriteLine("Information about this package.");
        writer.WriteLine("========================");
        await writer.FlushAsync();
    }
    stream.Position = 0;
    await blobClient.UploadAsync(stream, true);
    await stream.FlushAsync();
}

在本地保存zip文件会生成一个有效的zip(164字节)。将zip保存到blob存储(使用存储模拟器)会产生无效的zip(102字节)。 我不知道为什么

1 个答案:

答案 0 :(得分:2)

这是正确的代码。 问题是ZipArchive处理过早的内部流。请注意,在下面的代码中,在创建ZipArchive时,我已经将LeaveInnerStreamOpen传递为true,因为我们已经在外部使用了流。同样对于V11代码,我已切换到MemoryStream而不是blob流的OpenWrite,因为如果使用OpenWrite,则无法控制将流位置设置为0。而且您不需要任何冲洗:)

v11SDK

        var blockBlobClient = new BlockBlobClient(ConnectionString, ContainerName, "test-blob.zip");
        using var stream = new MemoryStream();
        using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
        {
            var readmeEntry = archive.CreateEntry("Readme.txt");
            using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
            {
                writer.WriteLine("Information about this package.");
                writer.WriteLine("========================");
            }
        }
        stream.Position = 0;
        await blockBlobClient.UploadAsync(stream);

v12SDK

        var blobClient = new BlobClient(ConnectionString, InputContainerName, "test-blob.zip");
        using var stream = new MemoryStream();
        using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
        {
            var readmeEntry = archive.CreateEntry("Readme.txt");
            using StreamWriter writer = new StreamWriter(readmeEntry.Open());
            {
                writer.WriteLine("Information about this package.");
                writer.WriteLine("========================");
            }
        }

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