generare un file zip da file di archiviazione BLOB BLU

Ho alcuni file memorizzati nella memoria BLOB BLU di Windows. Desidero prendere questi file e creare un file zip e archiviarli in una nuova cartella. Quindi restituire il percorso al file zip. Impostare l’authorization per il percorso del file zip in modo che i miei utenti possano scaricare il file zip sulle macchine locali facendo clic sul collegamento

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 

Voglio essere in grado di scorrere questi file e comprimerli tutti insieme per creare un nuovo file zip

( https://mystorage.blob.core.windows.net/myzippedfiles/allmyFiles.zip ) e restituire il percorso del file zip

Ho un gran numero di file nel mio BLOB azure. Quindi scaricarli e zipparli e caricare non è una buona idea.

Come posso farlo. Ho bisogno di un codice di esempio per farlo

Abbiamo risolto questo problema (parzialmente) comprimendo i file direttamente nel stream di output utilizzando i flussi di blob. Questo evita il problema del download di zipping, quindi l’invio ed evita il ritardo mentre ciò accade (abbiamo usato ICSharpZipLib, riferimento ). Ma significa comunque instradare il stream attraverso il server 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(); } 

Il servizio di archiviazione fa semplicemente questo:

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

Poiché lo storage blob è “solo” un object store, è necessario scaricarli da qualche parte (potrebbe essere un ruolo web / worker o il computer locale), comprimerli e quindi ricaricare nuovamente il file zip. Questo è l’unico modo per farlo per quanto ne so.

Non penso che tu possa evitare di scaricarli, comprimerli localmente e caricarli di nuovo.

Le utilità di compressione funzionano solo con risorse locali. Lo stesso storage di Azure non ha concetto / capacità di essere in grado di comprimere alcuni file da solo

Sarei sicuro al 99% che qualsiasi libreria zip utilizzata richieda risorse locali / file locali per creare un file zip.

Dai un’occhiata a Azure Local Storage for Worker Roles.

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

Sarai in grado di specificare una quantità di memoria locale all’interno del tuo ruolo di lavoratore al fine di salvare il contenuto accessibile nel processo.

per esempio

// Crea una sezione di archiviazione locale nella tua configurazione.

      

// Quindi salva i tuoi file nella memoria locale

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

Dopo aver salvato tutti i file in LocalStorage, utilizzare ZipLibrary per raggruppare insieme tutti i percorsi dei file

Penso che tu possa usare il webjob o il ruolo di lavoratore per farlo. Quando si riceve una richiesta dell’utente, spingere questa richiesta in coda, quindi restituire l’id del lavoro all’utente. Il job Webjob o worker preleva la richiesta dalla coda, scarica questi file e li zip, quindi carica il file zip sul blob di archiviazione. Il codice del lato anteriore può utilizzare il polling del rotolo ajax con l’id del processo per ottenere l’url reale di download al termine.

non pensare che l’azure fornisca le funzionalità fuori dalla scatola per lo zippamento. Se hai bisogno di evitare i tempi di consegna, forse. usare un ruolo di assistente in ufficio è una buona idea che sceglierà i tuoi file da certa coda.zip li caricherà e archivierà l’url per te da qualche parte come sql db.Ho fatto cose simili mentre comunicavo con db quindi puoi essere certo che funzionerà molto velocemente senza che l’utente si accorga che in realtà non sta accadendo al front end.