Azure Function Blob 触发器将文件复制到文件共享

Azure Function Blob Trigger copy file to File Share

寻求有关如何在使用 Azure Function Blob 触发器 (v3) 时将文件从 Azure Blob 存储复制到文件共享的帮助

我看到很多关于从 File Share 复制到 Blob 的文章和 SO 问题,但没有任何相反的东西,并且尝试反转我发现的代码示例效果不佳

我想出了一个解决方案,但它并不理想,因为我认为它是先将文件下载到内存中,然后再将其上传到文件共享:


        [FunctionName("MyBlobTrigger")]
        public async void Run([BlobTrigger("uploads/{name}", Connection = "UploadStorageAccount")]Stream myBlob, string name, ILogger log, CancellationToken cancellationToken)
        {

            ShareClient share = new ShareClient(storageConnection, fileShareName);

            ShareDirectoryClient directory = share.GetRootDirectoryClient();
            ShareFileClient fileShare = directory.GetFileClient(name);

            try
            {
                using (Stream stream = myBlob)
                {
                    fileShare.Create(stream.Length);
                    await fileShare.UploadRangeAsync(new Azure.HttpRange(0, stream.Length), stream);
                }

            }
         }

所以这确实有效,但存在以下问题:

  1. 我认为是先下载到内存再上传,最好只在Azure服务中传输文件,可能有一些非常大的文件
  2. 我也更愿意为我的 blob 使用 CloudBlockBlob 而不是 Stream,主要原因是在函数结束时我需要删除文件,如果使用 CloudBlockBlob,我可以轻松地做到这一点。问题是我在使用它时一直无法弄清楚如何进行复制

有什么想法吗?

编辑 - 从接受的答案中使用的最终代码:

    [FunctionName("MyBlobTrigger")]
    public async void Run([BlobTrigger("uploads/{name}", Connection = "UploadStorageAccount")]CloudBlockBlob myBlob, string name, ILogger log, CancellationToken cancellationToken)
    {

        ShareClient share = new ShareClient(storageConnection, fileShareName);

        ShareDirectoryClient directory = share.GetRootDirectoryClient();
        ShareFileClient fileShare = directory.GetFileClient(name);

        try
        {

            SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
                Permissions = SharedAccessBlobPermissions.Read
            };
            var sasToken = myBlob.GetSharedAccessSignature(sasConstraints);
            var blobSasUrl = $"{myBlob.Uri.AbsoluteUri}{sasToken}";

            fileShare.Create(myBlob.Properties.Length);
            await fileShare.StartCopyAsync(new Uri(blobSasUrl));

要将 blob 的内容复制到文件共享文件,实际上并不需要先下载它。您可以简单地使用 Azure 存储的异步服务器端复制功能。

本质上,您会为至少具有 read 权限的 blob 创建一个 SAS URL,然后将其用作文件复制操作的源 URL。

我在下面添加了一些伪代码来展示它是如何完成的。

[FunctionName("MyBlobTrigger")]
public async void Run([BlobTrigger("uploads/{name}", Connection = "UploadStorageAccount")]CloudBlockBlob myBlob, string name, ILogger log, CancellationToken cancellationToken)
{

    //Step 1: Get shared access signature for the blob.
    //var sasToken = myBlob.GetSharedAccessSignature();
    
    //Step 2: Get SAS URL for the blob.
    //var blobSasUrl = $"{myBlob.Uri.AbsoluteUri}{sasToken}";

    ShareClient share = new ShareClient(storageConnection, fileShareName);

    ShareDirectoryClient directory = share.GetRootDirectoryClient();
    ShareFileClient fileShare = directory.GetFileClient(name);

    ShareClient share = new ShareClient(storageConnection, fileShareName);

    ShareDirectoryClient directory = share.GetRootDirectoryClient();
    ShareFileClient fileShare = directory.GetFileClient(name);

    try
    {
        //Step 3: Create empty file based on blob's content length
        //fileShare.Create(myBlob.Properties.Length);
        //Step 4: Copy blob's contents to storage file using async file copy.
        //await fileShare.StartCopyAsync(new Uri(blobSasUrl));
    }
}