【问题标题】:Zip Azure Blob Files in C# Getting Damaged在 C# 中压缩 Azure Blob 文件被损坏
【发布时间】:2021-01-14 12:57:36
【问题描述】:

我正在尝试使用 ZipArchive 压缩我的 blob 存储文件并将该 zip 流上传回 blob 存储。

以下是将文件流下载到 Zip 条目并上传回 blob 存储的代码,但问题是当我返回存储资源管理器并下载我的 zip 文件时,它给了我这个错误:

存档格式未知或已损坏

    var account = _cloudStorageAccount;
                var blobClient = account.CreateCloudBlobClient();
                CloudBlobContainer container = _blobClient.GetContainerReference("myFiles");
                CloudBlockBlob cloudBlockBlob = container.GetBlockBlobReference("myFile.pdf");
                MemoryStream zipStream = new MemoryStream();
                using (var zip = new ZipArchive(zipStream, ZipArchiveMode.Create  , true))
                {
                    ZipArchiveEntry orderEntry = zip.CreateEntry("myFile.pdf");
                    using (Stream entryStream = orderEntry.Open())
                    {
                        var cloudBlockClient = container.GetBlockBlobReference("myFile.pdf");
                        await cloudBlockClient.DownloadToStreamAsync(entryStream);
                    }
                    CloudBlobContainer _blobContainer = _blobClient.GetContainerReference("protocol");
                    CloudBlockBlob cloudBlockBlobZip = _blobContainer.GetBlockBlobReference("Fifth.zip");
                    cloudBlockBlobZip.Properties.ContentType = "zip";
                    zipStream.Seek(0, SeekOrigin.Begin);
                    zipStream.Position = 0;
                    await cloudBlockBlobZip.UploadFromStreamAsync(zipStream);
                    var fileUrl = cloudBlockBlobZip.Uri.AbsoluteUri;
                    return zipStream;
                }
              

【问题讨论】:

  • 嗯,您可以尝试代替 DownloadToStreamAsync 开始下载(返回一个 Stream),然后在流上使用 CopyAsync 将其复制到 entryStream。
  • 我使用了 BeginDownloadToStream 但在 AsyncCallback 中给我输出,所以在回调中我无法将流设置为 zip 条目。
  • 那不是正确的,那是老式异步。您使用的是较新的 Azure.Storage.Blobs 库还是较旧的库?

标签: azure azure-blob-storage


【解决方案1】:

关于这个问题,请参考以下代码。我使用新的存储 SDK Azure.Storage.Blobs

 string[] blobs = { "",... };
            string connectionString = "";
            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
            var sourceContainer = blobServiceClient.GetBlobContainerClient("input");
            var desContainer = blobServiceClient.GetBlobContainerClient("output");
            var desBlob= desContainer.GetBlockBlobClient( "my.zip");
            var options = new BlockBlobOpenWriteOptions {
                HttpHeaders = new BlobHttpHeaders {
                    ContentType = MimeMapping.GetMimeMapping("my.zip"),
                },
            };
          using (var outStream = await desBlob.OpenWriteAsync(true, options).ConfigureAwait(false))
            using (var zipArchive = new ZipArchive(outStream, ZipArchiveMode.Create)) {
                foreach (var blob in blobs)
                {
                    var source = sourceContainer.GetBlobClient(blob);
                    var entry = zipArchive.CreateEntry(blob, CompressionLevel.Fastest);

                    // approach 1
                    using (var entryStream = entry.Open())
                    {
                        await source.DownloadToAsync(entryStream).ConfigureAwait(false);
                        entryStream.Close();
                    }

                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2021-11-22
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多