无需Azure存储资源管理器,批量下载Azure Blob文件为ZIP的方案咨询
可行替代解决方案
方案1:Azure Function + Blob Storage SDK
自定义程度最高,完全可控打包逻辑与通知触发:
- 执行步骤:
- 创建HTTP或定时触发的Azure Function
- 用
Azure.Storage.BlobsSDK遍历目标容器下所有Blob - 在Function临时存储或内存中完成文件打包(大文件建议分块处理,避免内存溢出)
- 将生成的ZIP文件上传回指定Blob容器
- 触发客户端通知:
- 调用预设的客户端HTTP回调接口,传递ZIP下载链接
- 用Azure SendGrid发送带下载链接的邮件
- 通过Azure Notification Hubs向客户端设备推送通知
- 核心代码片段(C#示例):
// 初始化Blob服务客户端 var blobServiceClient = new BlobServiceClient(Environment.GetEnvironmentVariable("AzureWebJobsStorage")); var containerClient = blobServiceClient.GetBlobContainerClient("your-target-container"); // 创建ZIP流 using var zipStream = new MemoryStream(); using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) { await foreach (var blobItem in containerClient.GetBlobsAsync()) { var blobClient = containerClient.GetBlobClient(blobItem.Name); var zipEntry = archive.CreateEntry(blobItem.Name); using var entryStream = zipEntry.Open(); await blobClient.DownloadToAsync(entryStream); } } zipStream.Position = 0; // 上传ZIP到Blob存储 var zipBlobClient = containerClient.GetBlobClient("batch-files.zip"); await zipBlobClient.UploadAsync(zipStream, overwrite: true); // 触发客户端HTTP回调通知 using var httpClient = new HttpClient(); await httpClient.PostAsync("https://your-client-notify-url", new StringContent($"ZIP打包完成,下载链接:{zipBlobClient.Uri}"));
方案2:Azure Logic Apps 低代码实现
无需大量编码,通过可视化拖拽完成全流程:
- 流程步骤:
- 选择触发方式:手动触发(按需执行)或定时触发
- 添加「Azure Blob Storage - 获取Blob列表」动作,指定目标容器
- 添加「压缩文件」动作,将所有Blob加入压缩任务,设置ZIP文件名
- 添加「Azure Blob Storage - 创建Blob」动作,将ZIP文件保存到指定容器
- 配置通知动作:
- 用「Office 365 Outlook - 发送邮件」,附上ZIP的SAS下载链接
- 用「HTTP - 发送POST请求」调用客户端通知接口
- 用「Microsoft Teams - 发布消息」推送通知到指定团队频道
方案3:Azure Automation Runbook(PowerShell)
适合运维自动化场景,脚本化执行打包与通知:
- 执行步骤:
- 在Azure Automation中创建PowerShell Runbook
- 导入
Azure.Storage.Blobs模块,通过托管身份或服务主体授权访问Blob存储 - 编写脚本遍历Blob、打包为ZIP并上传回存储容器
- 添加通知逻辑:用SendGrid发送邮件,或调用HTTP通知接口
- 核心脚本片段:
# 连接到Azure存储账户 $storageContext = New-AzStorageContext -StorageAccountName "your-storage-account" -UseConnectedAccount $containerName = "your-target-container" $blobs = Get-AzStorageBlob -Container $containerName -Context $storageContext # 创建临时ZIP文件 $tempDir = "D:\temp" New-Item -Path $tempDir -ItemType Directory -Force | Out-Null $zipPath = "$tempDir\batch-files.zip" # 下载Blob到临时目录并打包 foreach ($blob in $blobs) { $localPath = "$tempDir\$($blob.Name)" $blob.ICloudBlob.DownloadFile($localPath) } Compress-Archive -Path "$tempDir\*" -DestinationPath $zipPath -Force # 上传ZIP到Blob存储 Set-AzStorageBlobContent -File $zipPath -Container $containerName -Blob "batch-files.zip" -Context $storageContext -Force # 生成SAS下载链接并发送邮件通知 $sasToken = Get-AzStorageBlobSASToken -Container $containerName -Blob "batch-files.zip" -Context $storageContext -Permission r -ExpiryTime (Get-Date).AddDays(7) $downloadUrl = "https://your-storage-account.blob.core.windows.net/$containerName/batch-files.zip$sasToken" Send-MailMessage -To "client@example.com" -From "notify@example.com" -Subject "ZIP打包完成" -Body "下载链接:$downloadUrl" -SmtpServer "smtp.sendgrid.net" -Credential (Get-AutomationPSCredential "SendGridCred") -Port 587 -UseSsl
内容的提问来源于stack exchange,提问作者Nagu_R
相关产品推荐
相关产品推荐

