Azure函数Blob触发器将文件复制到文件共享 [英] Azure Function Blob Trigger copy file to File Share

查看:22
本文介绍了Azure函数Blob触发器将文件复制到文件共享的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

查找有关使用Azure函数Blob触发器(V3)时如何将文件从Azure Blob存储复制到文件共享的帮助

我看到了许许多多关于从文件共享复制到Blob的文章和问题,但没有一篇是反向的,并且试图反转我找到的代码示例的效果不是很好

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


        [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 Storage的异步服务器端复制功能即可。

实际上,您将至少使用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));
    }
}

这篇关于Azure函数Blob触发器将文件复制到文件共享的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆