You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Azure Function Blob Trigger实现Blob到File Share的文件复制方案咨询

Azure Function V3 Blob Trigger 实现Blob存储到文件共享的服务端直传方案

需求背景

借助V3版本Azure Function的Blob触发器,实现Blob存储中的文件自动同步到文件共享(File Share)。现有公开技术资料多为文件共享向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);
        }
    }
}

该方案存在两个明显缺陷:

  • 文件流需要先下载到函数运行的本地内存再上传到文件共享,处理超大文件时性能极低,带宽消耗高
  • 触发器输入为Stream类型,无法直接操作源Blob对象,难以在同步完成后直接删除源文件

优化后最终方案

优化后的方案完美解决上述问题:触发器直接绑定CloudBlockBlob类型接收源Blob对象,通过生成源Blob的临时只读SAS链接,调用文件共享的服务端复制接口实现全程Azure内部传输,无需占用函数本地资源,同步完成后可直接调用源Blob的删除方法清理源文件。
最终实现代码如下:

[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删除逻辑,示例:
        // await myBlob.DeleteIfExistsAsync();
    }
}

内容的提问来源于stack exchange,提问作者MikeM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:45:03