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

我有一些文件存储在我的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 

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

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

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

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

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

  public void ZipFilesToResponse(HttpResponseBase response, IEnumerable 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(); } 

存储服务只是这样做:

 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); } 

由于blob存储“只是”一个对象存储,你需要将它们下载到某个地方(它可能是一个web / worker角色或你的本地计算机),压缩它们然后重新上传zip文件。 据我所知,这是唯一的方法。

我不认为你可以避免下载它们,在本地压缩它们并上传它们。

压缩实用程序仅适用于本地资源。 Azure存储本身没有能够自行压缩某些文件的概念/能力

我99%肯定你使用的任何zip库都需要本地资源/本地文件才能创建一个zip文件。

查看Azure Local Storage for Worker Roles。

http://vkreynin.wordpress.com/2010/01/10/learning-azure-local-storage-with-me/

您将能够在工作者角色中指定一定量的本地存储,以便保存可在进程中访问的内容。

例如

//在配置中创建本地存储部分。

      

//然后将文件保存到本地存储

 CloudBlobContainer container = blobClient.GetContainerReference("myfiles"); CloudBlob blob = container.GetBlobReference("2b5f8ea6-3dc2-4b77-abfe-4da832e02556/AppList/isjirleq/mydocs1.doc"); LocalResource myStorage = RoleEnvironment.GetLocalResource("myLocalStorage"); string filePath = Path.Combine(myStorage.RootPath, "mydocs1.doc"); blob.DownloadToFile(filePath); 

在LocalStorage中保存所有文件后,使用ZipLibrary将所有文件路径捆绑在一起

我认为你可以使用webjob或worker角色来完成它。 当您收到用户的请求时,将此请求推送到队列中,然后将作业ID返回给用户。 Webjob或辅助角色从队列中获取请求,并下载这些文件并压缩它们,然后将zip文件上载回存储blob。 前端代码可以使用带有作业ID的ajax roll polling来获取真正的下载URL。

不要认为azure提供任何开箱即用的function。如果你需要避免周转时间也许。使用后台工作者角色是一个好主意,它会从某个queue.zip上传它们并为你存储url sql db。我在与db通信时做了类似的事情,所以你可以放心它会很快工作而不会让用户意识到它实际上并没有发生在前端。