使用 @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

将文件保存到 Azure Blob 存储的奇怪行为

如何使用 Javascript SDK 为 Azure 存储生成用户委托 SAS

JS Azure 博客存储 - 运行时出现需要错误?

使用 Blob 特定的 SAS 令牌连接和更新 Azure Blob

将文件从浏览器上传到 Azure Blob 存储,无需 SAS 密钥