2015-05-26 6 views
17

Sto già elencando con successo i file disponibili, ma avevo bisogno di sapere come potevo trasferire quel file nel browser per un utente da scaricare senza necessariamente salvarlo sul serverCome scaricare un file dal browser da Azure Blob Storage

Ecco come ottenere l'elenco dei file

var azureConnectionString = CloudConfigurationManager.GetSetting("AzureBackupStorageConnectString"); 
var containerName = ConfigurationManager.AppSettings["FmAzureBackupStorageContainer"]; 
if (azureConnectionString == null || containerName == null) 
    return null; 

CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(azureConnectionString); 
var backupBlobClient = backupStorageAccount.CreateCloudBlobClient(); 
var container = backupBlobClient.GetContainerReference(containerName); 
var blobs = container.ListBlobs(useFlatBlobListing: true); 
var downloads = blobs.Select(blob => blob.Uri.Segments.Last()).ToList(); 

risposta

36

Mentre il contenuto di blob può essere trasmesso attraverso un server Web, e insieme all'utente finale tramite browser, questa soluzione carica il server Web, sia cpu che NIC.

Un approccio alternativo consiste nel fornire all'utente finale un uri al blob desiderato da scaricare, che può fare clic nel contenuto HTML. per esempio. https://myaccount.blob.core.windows.net/mycontainer/myblob.ext.

Il problema con questo è se il contenuto è privato, poiché un uri come quello sopra non funzionerà se non si utilizzano blob pubblici. A tale scopo, è possibile creare una firma di accesso condiviso (o una politica memorizzata sul server), che quindi genera una sequenza di query hash aggiunta all'uri. Questo nuovo uri sarebbe valido per un dato periodo di tempo (10 minuti, ad esempio).

Ecco un piccolo esempio di creazione di un SAS per un blob:

var sasConstraints = new SharedAccessBlobPolicy(); 
sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5); 
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10); 
sasConstraints.Permissions = SharedAccessBlobPermissions.Read; 

var sasBlobToken = blob.GetSharedAccessSignature(sasConstraints); 

return blob.Uri + sasBlobToken; 

Si noti che l'ora di inizio è impostato per essere un paio di minuti nel passato. Questo è per gestire la deriva del clock. Ecco il full tutorial Ho afferrato/modificato questo esempio di codice da.

Utilizzando l'accesso diretto al BLOB, si ignorerà completamente l'istanza di ruolo/sito Web VM/Web (riducendo il carico del server) e il contenuto del BLOB dell'utente finale verrà prelevato direttamente dall'archiviazione BLOB. Puoi comunque utilizzare la tua app Web per gestire le autorizzazioni, decidere quali contenuti pubblicare, ecc. Ma ... questo ti consente di collegarti direttamente alle risorse BLOB, piuttosto che trasmetterli tramite il tuo server web.

+0

Ulteriori informazioni sul modello di chiavi di Valet qui: https://msdn.microsoft.com/en-us/library/dn568102.aspx –

+0

Devo adottare un approccio simile quando ottengo l'errore di scaricare un file con solo il relativo URI. Grazie per l'heads up di David. – Kris

7

una volta che l'utente fa clic un file il server risponde con questo

var blob = container.GetBlobReferenceFromServer(option); 

var memStream = new MemoryStream(); 
blob.DownloadToStream(memStream); 

Response.ContentType = blob.Properties.ContentType; 
Response.AddHeader("Content-Disposition", "Attachment;filename=" + option); 
Response.AddHeader("Content-Length", blob.Properties.Length.ToString()); 
Response.BinaryWrite(memStream.ToArray()); 

grazie enorme a Dhananjay Kumar per questa soluzione

+2

Così facendo, ci si rende conto che l'intero contenuto del BLOB verrà instradato attraverso il server, giusto? Cioè, il contenuto del BLOB passerà dallo storage BLOB alla tua VM/sito web/istanza del ruolo web, quindi al tuo utente finale, tramite IIS/OWIN/ecc.? –

+0

cosa consiglieresti? Non riesco a consentire agli utenti finali di accedere all'intero spazio di archiviazione, pertanto un Explorer di archiviazione di Azure non funzionerebbe. – stackoverfloweth

+3

Ho postato una risposta alternativa. –