Node.js 使用@azure/storage blob将blob从一个存储帐户复制到另一个存储帐户

Node.js 使用@azure/storage blob将blob从一个存储帐户复制到另一个存储帐户,node.js,azure-storage,azure-storage-blobs,azure-node-sdk,Node.js,Azure Storage,Azure Storage Blobs,Azure Node Sdk,使用@azure/storage blob将blob从一个存储帐户复制到另一个存储帐户的最佳方法是什么 我认为使用流最好,而不是下载然后上传,但我想知道下面的代码是否是使用流的正确/最佳实现 const srcCredential = new ClientSecretCredential(<src-ten-id>, <src-client-id>, <src-secret>); const destCredential = new ClientSecretCr

使用@azure/storage blob将blob从一个存储帐户复制到另一个存储帐户的最佳方法是什么

我认为使用流最好,而不是下载然后上传,但我想知道下面的代码是否是使用流的正确/最佳实现

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);
const srcredential=new ClientSecretCredential(,);
const destCredential=新客户端secretCredential(,);
const srcBlobClient=新的BlobServiceClient(,srcCredential);
const destBlobClient=新的BlobServiceClient(,destCredential);
const sourceContainer=srcBlobClient.getContainerClient(“src容器”);
const destContainer=destBlobClient.getContainerClient(“dest容器”);
const sourceBlob=sourceContainer.getBlockBlobClient(“blob”);
const destBlob=destContainer.getBlockBlobClient(sourceBlob.name)
//复制斑点
wait destBlob.uploadStream((wait sourceBlob.download()).readableStreamBody);

您当前的方法是下载源blob,然后重新上传它,这并不是真正的最佳方法

更好的方法是使用
异步复制blob
。您希望使用的方法是。您需要在源blob上创建一个至少具有
读取
权限的
共享访问签名
URL。您可以使用SDK方法来创建它

const sourceBlob = sourceContainer.getBlockBlobClient("blob");
const destBlob = destContainer.getBlockBlobClient(sourceBlob.name);

const sourceBlobSasUrl = GenerateSasUrlWithReadPermissionOnSourceBlob(sourceBlob);
// copy blob
await destBlob.beginCopyFromURL(sourceBlobSasUrl);

真奇怪。你能告诉我更多关于你的设置吗?请编辑您的问题并包含最新代码。此外,您应该能够深入挖掘错误消息,并查看哪个HTTP头的格式不正确。也请分享。对不起,我没有在SAS之前添加BLOBURL部分。但是,我现在遇到的问题是,它抛出了一个错误,说“RestError:此存储帐户上不允许公共访问”。存储帐户配置为禁用公共blob访问,但配置为允许SAS已启用“允许共享密钥访问”。只有在启用公共访问时,这才有效吗?请查看此线程:和此线程:。似乎要使此解决方案起作用,应该启用公共访问。它起作用了!!很抱歉,它又是URL(缺少SAS查询参数之前的“?”),这就是为什么出现公共访问错误时认为它只是一个URL。您不需要在存储帐户上启用“公共访问”,只需要启用SAS访问即可。我能够在一个大文件上执行复制,而且完成得非常快。谢谢你的回答!!