使用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
相关产品推荐
相关产品推荐

