generar un archivo Zip de archivos de almacenamiento de blob azure

Tengo algunos archivos almacenados en el almacenamiento de blobs azul de mi ventana. Deseo tomar estos archivos y crear un archivo zip y almacenarlo en una nueva carpeta. Luego, devuelva la ruta al archivo zip. Establezca el permiso en la ubicación del archivo zip para que mis usuarios puedan descargar el archivo zip en sus máquinas locales haciendo clic en el enlace

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 

Quiero poder recorrer estos archivos y comprimirlos para crear un nuevo archivo zip

( https://mystorage.blob.core.windows.net/myzippedfiles/allmyFiles.zip ) y devuelve la ruta al archivo zip

Tengo una gran cantidad de archivos en mi blob azul. Así que descargarlos, comprimirlos y cargarlos no es una buena idea.

¿Cómo puedo hacer esto? Necesito un código de muestra para hacer esto

Hemos resuelto este problema (parcialmente) comprimiendo los archivos directamente en la secuencia de salida usando las streams de blob. Esto evita el problema de descargar el proceso de compresión y envío y evita el retraso mientras esto sucede (utilizamos ICSharpZipLib, referencia ). Pero aún significa enrutar la transmisión a través del servidor 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(); } 

El servicio de almacenamiento simplemente hace esto:

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

Como el almacenamiento de blobs es “solo” un almacén de objetos, necesitaría descargarlos en algún lugar (podría ser un rol de web / trabajador o su computadora local), comprimirlos y luego volver a cargar el archivo zip. Esa es la única forma de hacerlo, hasta donde yo sé.

No creo que pueda evitar descargarlos, comprimirlos localmente y cargarlos de nuevo.

Las utilidades de compresión solo funcionan con recursos locales. Azure Storage no tiene el concepto / capacidad de poder comprimir algunos archivos por sí mismo

Estaría 99% seguro de que cualquier biblioteca zip que use requerirá recursos locales / archivos locales para crear un archivo zip.

Eche un vistazo a Azure Local Storage for Worker Roles.

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

Podrá especificar una cantidad de almacenamiento local dentro de su rol de trabajador para poder guardar contenido accesible en proceso.

p.ej

// Crea una sección de Almacenamiento local en tu configuración.

      

// Luego guarda tus archivos en el almacenamiento local

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

Una vez que haya guardado todos sus archivos en LocalStorage, use su ZipLibrary para agrupar todas las rutas de archivos

Creo que puedes usar el webjob o el rol de trabajador para hacerlo. Cuando reciba la solicitud de un usuario, inserte esta solicitud en la cola y luego devuelva la identificación del trabajo al usuario. Webjob o la función de trabajador obtienen la solicitud de la cola, y descargan estos archivos y los comprimen, luego cargan el archivo zip nuevamente en Blob de almacenamiento. El código de la parte frontal puede usar ajax roll polling con la identificación del trabajo para obtener la url de descarga real cuando esté terminada.

No creo que Azure proporcione ninguna funcionalidad lista para comprimir. Si necesita evitar el tiempo de respuesta, quizás sea una buena idea utilizar una función de trabajador en segundo plano, que seleccionará sus archivos de cierta cola.zip, cárguelos y almacene la URL en un lugar como sql db.He hecho cosas similares mientras me comunico con db, así que puede estar seguro de que funcionará muy rápido sin que el usuario se dé cuenta de que en realidad no está sucediendo en la interfaz.

    Intereting Posts