从azure blob存储文件生成Zip文件

Ste*_*eve 18 c# azure azure-storage-blobs visual-studio-2012

我有一些文件存储在我的windows azure blob存储中.我想获取这些文件并创建一个zip文件并存储到一个新文件夹.然后返回zip文件的路径.设置zip文件位置的权限,以便我的用户可以通过单击链接将zip文件下载到本地计算机

 https://mystorage.blob.core.windows.net/myfiles/2b5f8ea6-3dc2-4b77-abfe-4da832e02556/AppList/isjirleq/mydocs1.doc
 https://mystorage.blob.core.windows.net/myfiles/2b5f8ea6-3dc2-4b77-abfe-4da832e02556/tempo/xyz/mymusic.mp3
 https://mystorage.blob.core.windows.net/myfiles/2b5f8ea6-3dc2-4b77-abfe-4da832e02556/general/video/myVideo.wmv
 https://mystorage.blob.core.windows.net/myfiles/2b5f8ea6-3dc2-4b77-abfe-4da832e02556/photo/photo1.png
Run Code Online (Sandbox Code Playgroud)

我希望能够循环这些文件并将它们一起压缩以创建一个新的zip文件

(https://mystorage.blob.core.windows.net/myzippedfiles/allmyFiles.zip)并返回zip文件的路径

我的azure blob中有大量文件.所以下载它们并压缩它们并上传并不是一个好主意.

我该怎么做.我需要一些示例代码来执行此操作

Ric*_*ard 28

我们通过使用blob流将文件直接压缩到输出流来解决这个问题(部分).这避免了下载压缩然后发送的问题,并避免了发生这种情况时的延迟(我们使用ICSharpZipLib,参考).但它仍然意味着通过Web服务器路由流:

  public void ZipFilesToResponse(HttpResponseBase response, IEnumerable<Asset> files, string zipFileName)
    {
        using (var zipOutputStream = new ZipOutputStream(response.OutputStream))
        {
            zipOutputStream.SetLevel(0); // 0 - store only to 9 - means best compression
            response.BufferOutput = false;
            response.AddHeader("Content-Disposition", "attachment; filename=" + zipFileName);
            response.ContentType = "application/octet-stream";

            foreach (var file in files)
            {
                var entry = new ZipEntry(file.FilenameSlug())
                {
                    DateTime = DateTime.Now,
                    Size = file.Filesize
                };
                zipOutputStream.PutNextEntry(entry);
                storageService.ReadToStream(file, zipOutputStream);
                response.Flush();
                if (!response.IsClientConnected)
                {
                   break;
                }
            }
            zipOutputStream.Finish();
            zipOutputStream.Close();
        }
        response.End();
    }
Run Code Online (Sandbox Code Playgroud)

存储服务只是这样做:

public void ReadToStream(IFileIdentifier file, Stream stream, StorageType storageType = StorageType.Stored, ITenant overrideTenant = null)
    {
        var reference = GetBlobReference(file, storageType, overrideTenant);
        reference.DownloadToStream(stream);
    }
private CloudBlockBlob GetBlobReference(IFileIdentifier file, StorageType storageType = StorageType.Stored, ITenant overrideTenant = null)
        {
            var filepath = GetFilePath(file, storageType);
            var container = GetTenantContainer(overrideTenant);
            return container.GetBlockBlobReference(filepath);
        }
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,zip文件直接写入响应流,因此实际上一旦写入文件流就开始下载.因此延迟可以忽略不计,只要您能够比下载数据更快地读取和压缩数据(在大多数情况下,您可以这样做).这就是我们这样做的原因. (2认同)
  • 对于网络核心:使用 `response.Body`,确保安装 SharpZipLib 的预览版本(与 netstadnard 兼容)并删除出现语法错误的代码(例如 `BufferOutput`) (2认同)

Gau*_*tri 4

由于 Blob 存储“只是”一个对象存储,因此您需要将它们下载到某个地方(可能是 Web/工作者角色或您的本地计算机),对其进行压缩,然后重新上传 zip 文件。据我所知,这是唯一的方法。