如何使用 node.js 将 blob 移动到 Azure 中的子目录
How to move blob into subdirectory in Azure using node.js
我有一个 node.js 服务应该从 azure 下载文件,处理它,当它完成后 - 将它移动到同一容器内的 "done" 子文件夹。
我已经在文档中挖掘了一个多小时,但找不到任何方法来复制 blob 或重命名它,因为如果我从头开始将其创建为 done/blob-name,它将在视觉上呈现它在子文件夹中,因此重命名也可能会起作用(我知道它是如何工作的,这对我来说很好,我通过忽略所有名称中包含 done/ 的人来过滤 blob)。
唯一足够接近的是 startCopyFromURL,它是 "blob" class 的成员,但我不知道如何使用它 - 因为我只提供源而没有提供目的地...我所要求的只是一个简单的函数 copyBlob(sourceBlobURL, dstBlobUrl) -.-
奇怪的是,Azure 门户不提供任何复制/重命名选项,但是有一个叫做 "storage explorer" 的东西(可以通过 azure 门户访问),据我所知 - 它是一个 GUI 启用高级对 blob 的操作,包括复制操作和子文件夹管理。因此,如果有一个 GUI 可以做到这一点,则必须有一种编程方式...
我正在使用(有点)新的 v10 sdk (here),只需要我的脚本中的 @azure/storage-blob 部分。
非常感谢您的帮助!
更新:我确实找到了对名为 "startCopyAsync" 的方法的引用,但我可以在网上找到的所有示例都是从 sdks 到不同语言(例如 c#)的,并且有 1-2 年的历史,而新的JS sdk 仅在几周前(2019 年 7 月)才正式成为 js 的主要 sdk。在新的 JS sdk 中找不到任何关于此功能的提及。
您不能重命名 blob;您只能将 blob 复制到新的 blob(或上传新的 blob)。
关于子目录:没有这样的东西。层次结构是:
account / container / blob
在 blob 的名称中看起来像子目录的只是路径字符。例如:
https://myblobs.blob.core.windows.net/mycontainer/images/image1.jpg
实际上是一个名为 "images/image1.jpg"
的 blob
各种 blob-listing 调用允许您使用分隔符进行过滤,从而产生子目录的错觉。
因此,在您的情况下,您需要将 "processed" blob 上传到新的 blob(无论是在同一容器中还是在新容器中)。如果你上传到同一个容器,你需要想出一个新的名字。如果您为已处理的 blob 使用不同的容器,那么您就不必担心想出不同的 blob 名称。
您可以使用 startCopyFromURL
,正如您自己假设的那样。源是第一个参数,目标是您用来调用此方法的 Blob 对象。所以,流程是这样的:
- 创建一个目标 Blob 对象(空的,包括你需要的所有 sub-folders,比如
done
)
- 调用
startCopyFromURL
提供来源 URL
- 等待 promise 解析。
可以找到一个 non-javascript 示例 here。
我有一个 node.js 服务应该从 azure 下载文件,处理它,当它完成后 - 将它移动到同一容器内的 "done" 子文件夹。
我已经在文档中挖掘了一个多小时,但找不到任何方法来复制 blob 或重命名它,因为如果我从头开始将其创建为 done/blob-name,它将在视觉上呈现它在子文件夹中,因此重命名也可能会起作用(我知道它是如何工作的,这对我来说很好,我通过忽略所有名称中包含 done/ 的人来过滤 blob)。
唯一足够接近的是 startCopyFromURL,它是 "blob" class 的成员,但我不知道如何使用它 - 因为我只提供源而没有提供目的地...我所要求的只是一个简单的函数 copyBlob(sourceBlobURL, dstBlobUrl) -.-
奇怪的是,Azure 门户不提供任何复制/重命名选项,但是有一个叫做 "storage explorer" 的东西(可以通过 azure 门户访问),据我所知 - 它是一个 GUI 启用高级对 blob 的操作,包括复制操作和子文件夹管理。因此,如果有一个 GUI 可以做到这一点,则必须有一种编程方式...
我正在使用(有点)新的 v10 sdk (here),只需要我的脚本中的 @azure/storage-blob 部分。
非常感谢您的帮助!
更新:我确实找到了对名为 "startCopyAsync" 的方法的引用,但我可以在网上找到的所有示例都是从 sdks 到不同语言(例如 c#)的,并且有 1-2 年的历史,而新的JS sdk 仅在几周前(2019 年 7 月)才正式成为 js 的主要 sdk。在新的 JS sdk 中找不到任何关于此功能的提及。
您不能重命名 blob;您只能将 blob 复制到新的 blob(或上传新的 blob)。
关于子目录:没有这样的东西。层次结构是:
account / container / blob
在 blob 的名称中看起来像子目录的只是路径字符。例如:
https://myblobs.blob.core.windows.net/mycontainer/images/image1.jpg
实际上是一个名为 "images/image1.jpg"
各种 blob-listing 调用允许您使用分隔符进行过滤,从而产生子目录的错觉。
因此,在您的情况下,您需要将 "processed" blob 上传到新的 blob(无论是在同一容器中还是在新容器中)。如果你上传到同一个容器,你需要想出一个新的名字。如果您为已处理的 blob 使用不同的容器,那么您就不必担心想出不同的 blob 名称。
您可以使用 startCopyFromURL
,正如您自己假设的那样。源是第一个参数,目标是您用来调用此方法的 Blob 对象。所以,流程是这样的:
- 创建一个目标 Blob 对象(空的,包括你需要的所有 sub-folders,比如
done
) - 调用
startCopyFromURL
提供来源 URL - 等待 promise 解析。
可以找到一个 non-javascript 示例 here。