使用 @azure/storage-blob 将 blob 从一个存储帐户复制到另一个
Posted
技术标签:
【中文标题】使用 @azure/storage-blob 将 blob 从一个存储帐户复制到另一个【英文标题】:Copy blob from one storage account to another using @azure/storage-blob 【发布时间】:2021-06-27 03:34:48 【问题描述】:存储帐户的最佳方法是什么?
我认为最好使用流而不是下载然后上传,但想知道下面的代码是否是使用流的正确/最佳实现。
const srcCredential = new ClientSecretCredential(<src-ten-id>, <src-client-id>, <src-secret>);
const destCredential = new ClientSecretCredential(<dest-ten-id>, <dest-client-id>, <dest-secret>);
const srcBlobClient = new BlobServiceClient(<source-blob-url>, srcCredential);
const destBlobClient = new BlobServiceClient(<dest-blob-url>, destCredential);
const sourceContainer = srcBlobClient.getContainerClient("src-container");
const destContainer = destBlobClient.getContainerClient("dest-container");
const sourceBlob = sourceContainer.getBlockBlobClient("blob");
const destBlob = destContainer.getBlockBlobClient(sourceBlob.name)
// copy blob
await destBlob.uploadStream((await sourceBlob.download()).readableStreamBody);
【问题讨论】:
【参考方案1】:您当前的方法是下载源 blob,然后重新上传它,这并不是最佳的。
更好的方法是使用async copy blob
。您要使用的方法是beginCopyFromURL(string, BlobBeginCopyFromURLOptions)
。您需要在至少具有 Read
权限的源 blob 上创建一个 Shared Access Signature
URL。您可以使用generateBlobSASQueryParameters
SDK 方法来创建它。
const sourceBlob = sourceContainer.getBlockBlobClient("blob");
const destBlob = destContainer.getBlockBlobClient(sourceBlob.name);
const sourceBlobSasUrl = GenerateSasUrlWithReadPermissionOnSourceBlob(sourceBlob);
// copy blob
await destBlob.beginCopyFromURL(sourceBlobSasUrl);
【讨论】:
这很奇怪。你能告诉我更多关于你的设置吗?请编辑您的问题并包含您的最新代码。此外,您应该能够深入挖掘错误消息并查看哪个 HTTP 标头的格式不正确。请也分享一下。 抱歉,我没有在 SAS 之前添加 blob URL 部分。但是,我现在遇到的问题是它会引发错误,提示“RestError:此存储帐户不允许公共访问”。存储帐户配置为禁用公共 blob 访问,但配置为允许 SAS。 “允许共享密钥访问”已启用。这只有在启用公共访问时才有效吗? 请看这个帖子:docs.microsoft.com/en-us/answers/questions/40660/… 和这个:docs.microsoft.com/en-us/azure/storage/blobs/…。看来要让这个解决方案起作用,应该启用公共访问。 成功了!!抱歉,它又是 URL(在 SAS 查询参数之前错过了“?”),这就是为什么出现公共访问错误,认为它只是一个 URL。您无需在存储帐户上启用“公共访问”,只需启用 SAS 访问即可。我能够对一个大文件进行复制,而且完成得非常快。谢谢你的回答!!以上是关于使用 @azure/storage-blob 将 blob 从一个存储帐户复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript Azure Blob 存储移动 blob
如何使用 Javascript SDK 为 Azure 存储生成用户委托 SAS