【问题标题】:How to compress files to zip and upload to azure blob storage?如何将文件压缩为 zip 并上传到 azure blob 存储?
【发布时间】:2020-12-16 18:59:05
【问题描述】:

我对这段代码有一个奇怪的问题,它基本上是压缩文件 (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 字节)。 我不知道为什么

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我已经尝试过 v12SDK(废弃的 v11SDK),现在 zip 打开了,但它是空的。
    • 是的,请保持 leaveInnerStreamOpen = true,将其设为默认值的建议在其他情况下可能会出现问题,而不是 blob 上传,这也是通用的 .net 类。关于空拉链,这很奇怪!使用完全相同的代码对我来说很好!
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2017-08-27
    • 2019-08-13
    • 2021-06-03
    • 2021-09-28
    相关资源
    最近更新 更多