gpt4 book ai didi

c# - 如何在公共(public)访问设置为 'Private' 的容器中复制 blob?

转载 作者:行者123 更新时间:2023-12-02 07:43:16 25 4
gpt4 key购买 nike

我需要能够将 blob 从 1 个存储帐户中的容器复制到另一个存储帐户中的容器中。以前,源容器的公共(public)访问权限设置为“容器”。我使用连接字符串连接到帐户,然后获取对 blob 的引用。

我正在使用 StartCopyAsync(sourceBlob)。当容器将公共(public)访问设置为容器时,这最初工作正常。现在它抛出“指定的资源不存在”的 StorageException。这是权限问题吗?我本以为会出现一条错误消息,指出我没有权限。我可以看到资源在容器中。

假设这是一个权限问题,有没有办法从公共(public)访问设置为“私有(private)”的容器中复制 blob?文档建议可以通过“授权请求”来完成,但是你该怎么做呢?

更新

我已经尝试了 Gaurav Mantri 的建议,但目前收到错误“此请求无权执行此操作”。这是我的代码:

    private async Task<FileActionResult> CopyBlob(string blobName, string sourceBlobSasToken, string sourceBlobName, CloudBlockBlob targetBlob)
{
try
{
await targetBlob.StartCopyAsync(new Uri(sourceBlobSasToken));
var targetBlobRef = await _connectionFactory.GetContainerConnection(BlobContainerType.myTargetContainer).GetBlobReferenceFromServerAsync(targetBlob.Name);

while (targetBlobRef.CopyState.Status == CopyStatus.Pending)
{
await Task.Delay(500);
targetBlobRef = await _connectionFactory.GetContainerConnection(BlobContainerType.myTargetContainer).GetBlobReferenceFromServerAsync(targetBlob.Name);
}

if (targetBlobRef.CopyState.Status == CopyStatus.Success)
{
return new FileActionResult(blobName, true);
}
else
{
var errorMessage = $"{blobName} failed to copy from '{sourceBlobName}' to '{targetBlob}'. Status: {targetBlobRef.CopyState.Status}";
_logServiceApi.Trace(errorMessage);
return new FileActionResult(blobName, false, errorMessage);
}
}
catch (StorageException ex)
{
_logServiceApi.LogException(ex);
return new FileActionResult(blobName, false, ex.Message);
}
catch (AggregateException ex)
{
_logServiceApi.LogException(ex);
return new FileActionResult(blobName, false, ex.Message);
}
}

“sourceBlobSasToken”由这段代码检索并传入:

    public string GetFileStorageBlobSasUri(BlobContainerType blobContainer, string fileName, double tokenDuration, long? projectId = null)
{
var blob = GetBlockBlob(blobContainer, fileName, projectId);

var adHocPolicy = new SharedAccessBlobPolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(tokenDuration),
Permissions = SharedAccessBlobPermissions.Read
};

var sasContainerToken = blob.GetSharedAccessSignature(adHocPolicy);
return blob.Uri + sasContainerToken;
}

最佳答案

确实是权限问题。为了使复制 blob 操作正常工作,源 blob 必须可公开访问。从这里link :

enter image description here

当容器的 ACL 是公开的时,源 Blob 是可公开访问的,即任何人都可以通过其 URL 直接访问该 Blob。但是,一旦将容器的 ACL 更改为私有(private),源 blob 就不再可公开访问。

要解决您的问题,您需要做的是为源 blob 创建一个至少具有读取权限的 SAS URL,并在 StartCopyAsync 中使用该 SAS URL。方法。

关于c# - 如何在公共(public)访问设置为 'Private' 的容器中复制 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67941084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com