繁体   English   中英

如何复制Azure容器和Blob

[英]How to Copy Azure Containers & Blobs

我正在尝试将所有Blob复制到不同的存储中:

CloudBlobClient srcblobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobClient targetBlobClient = targetStorageAccount.CreateCloudBlobClient();

foreach (CloudBlobContainer cont in srcblobClient.ListContainers())
{
    foreach (IListBlobItem srcBlob in cont.ListBlobs(useFlatBlobListing: true))
    {                        
        var targetContainer = targetBlobClient.GetContainerReference(cont.Name);
        targetContainer.CreateIfNotExists();

        Uri thisBlobUri = srcBlob.Uri;
        var serverBlob = srcblobClient.GetBlobReferenceFromServer(thisBlobUri);

        ICloudBlob targetBlob = targetContainer.GetBlobReferenceFromServer(serverBlob.Name);

        targetBlob.StartCopyFromBlob(thisBlobUri);
    }
}

我能够看到blob列表和复制方法正在被调用targetBlob.StartCopyFromBlob(thisBlobUri);

但是,复制实际上并没有发生。 任何想法?

PS我正在使用Azure存储SDK 4.3,目标存储是开发存储。

编辑2:

对于远程天蓝色存储,复制上面的代码可以正常工作。

但是对于模拟存储,尝试创建容器时出现400 BadRequest错误:targetContainer.CreateIfNotExists();

我的仿真存储版本是3.0,似乎azure SDK和仿真器版本之间存在冲突。

哪个版本的存储客户端库可以与存储模拟器3.0一起很好地工作?

您收到此错误的原因确实是由于版本不匹配。 如果我没记错的话,Storage Emulator 3.0版将使用REST API版本2013-08-15 ,其中最新版本的存储客户端库将使用REST API版本2014-02-14 (Ref: http : //msdn.microsoft.com/ zh-CN / library / azure / dn744252.aspx )。 您可能会利用旧版本的存储客户端库。 您可以通过Nuget安装适当的版本。 例如,如果要安装Storage Client Library版本3.2.1,则可以执行以下操作:

安装包WindowsAzure.Storage-版本3.2.1(参考: http ://www.nuget.org/packages/WindowsAzure.Storage/3.2.1)

请尝试一下,看看是否可以解决问题。

在查看您的代码时,我还建议一些更改:

  • 我不建议将Blob容器的权限更改为Public 它公开了您的Blob存储并通过匿名访问使其可用。 我建议您在源Blob上创建具有Read Permission SAS URL,并使用这些SAS URL复制。 由于Blob复制是异步的,因此我建议保持SAS URL有效7天(为复制操作分配的最大时间)。
  • 我看到您在源Blob和目标Blob上都在执行GetBlobReferenceFromServer 不建议对源Blob使用此方法,因为它实际上会进行网络调用,因此对于您已经通过列表获得的每个Blob。 不建议在目标Blob上使用,因为如果目标Blob不存在,则此方法将抛出Not Found (404)

相反,我建议您将通过列表获得的Blob转换为适当的Blob类型(块或页面),然后获取SAS URL。 如果您知道所有Blob都是块Blob,则只需将它们强制转换为CloudBlockBlob对象,而不必担心强制转换。

我不确定的一件事是如何复制页面Blob。 在存储帐户之间进行复制时,页面Blob将作为页面Blob复制。 但是,我还没有尝试从存储帐户复制到开发存储帐户。 但是,如果您没有页面Blob,则不必担心:)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM