【问题标题】:Copy from Append Blob to BlockBlob从追加 Blob 复制到 BlockBlob
【发布时间】:2019-08-18 02:02:43
【问题描述】:

我想将我的 Blob 类型从 Append Blob 更改为 BlockBlob。 根据How to convert from Azure Append Blob to Azure Block Blob 这不可能。因此,我想制作一个副本

            var container = blobClient.GetContainerReference("videos");
            var sourceBlob = container.GetAppendBlobReference(blobName);
            var newBlobName = blobName + "FinalBlob";
            var targetBlob = container.GetBlobReference(newBlobName);

            targetBlob.StartCopyAsync(sourceBlob.Uri).Wait();

生成的 blob 是 Appendblob,而不是 BlockBlob

【问题讨论】:

  • 我不确定,但也许可以试一试 - 而不是 GetBlobReference(newBlobName) 使用 GetBlockBlobReference(newBlobName)

标签: azure azure-blob-storage


【解决方案1】:

无法通过复制操作更改 blob 类型。目标 blob 的类型将始终与源 blob 的类型相同。

我能想到的两种可能的解决方案:

  • 下载和上传:正如我在other answer 中提到的,您可以将附加 blob 下载到本地计算机,然后作为块 blob 再次上传。
  • 复制到文件共享并复制回:其他解决方案可能是先将 blob 复制到文件共享。复制操作完成后,您可以将该文件复制回 Blob 存储。在这种情况下,复制的 blob 的 blob 类型将始终为 Block Blob

【讨论】:

  • 嗨 Gaurav,Blob “非常”大,我不想将它保存在内存中。我喜欢“复制到文件共享并复制回来”的建议,尝试一下并返回结果。 brb
【解决方案2】:

复制命令可以正常工作:


    foreach (var blob in container.ListBlobs(input.OutputPrefix + "/", true).OfType<CloudAppendBlob>())
    {
        var test = container.GetBlockBlobReference(blob.Name.Replace(".csv", "out.csv"));
        await test.StartCopyAsync(new Uri(blob.Uri+blob.GetSharedAccessSignature(new SharedAccessBlobPolicy { Permissions= SharedAccessBlobPermissions.Read, SharedAccessExpiryTime= DateTimeOffset.UtcNow.AddHours(2) })));
    }

以上代码已经过测试并且可以运行。

【讨论】:

  • 它只会将附加 blob 复制到附加 blob。它不会将 blob 复制并附加到块 blob。
猜你喜欢
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2020-09-24
  • 2013-04-04
  • 1970-01-01
  • 2018-08-17
相关资源
最近更新 更多