2015-05-26 13 views
17

Udostępniałem już listę dostępnych plików, ale musiałem wiedzieć, w jaki sposób mogę przekazać ten plik do przeglądarki, aby użytkownik mógł pobrać plik bez konieczności zapisywania go na serwerzeJak pobrać plik do przeglądarki z usługi Azure Blob Storage

Oto jak uzyskać listę plików

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

Odpowiedz

36

Podczas gdy treści blob mogą być przesyłane strumieniowo przez serwer WWW, a także do użytkownika końcowego za pośrednictwem przeglądarki, to rozwiązanie obciąża serwer WWW, zarówno cpu, jak i NIC.

Alternatywnym podejściem jest dostarczenie użytkownikowi końcowemu pakietu URI do żądanego obiektu typu blob do pobrania, który może kliknąć zawartość HTML. na przykład https://myaccount.blob.core.windows.net/mycontainer/myblob.ext.

Problem polega na tym, że zawartość jest prywatna, ponieważ uri, takie jak powyższe, nie będzie działało, chyba że korzystasz z publicznych obiektów typu blob. W tym celu można utworzyć podpis udostępnionego dostępu (lub politykę przechowywaną na serwerze), co spowoduje, że do pliku uri zostanie dodany zakodowany ciąg znaków. Ten nowy uri będzie ważny przez określony czas (na przykład 10 minut).

Oto mały przykład tworząc SAS dla 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; 

Należy pamiętać, że czas startu jest ustawiony na kilka minut w przeszłości. Ma to na celu znoszenie zegara. Oto full tutorial Zrobiłem/zmodyfikowałem próbkę kodu.

Dzięki bezpośredniemu dostępowi typu blob całkowicie obejdziesz instancję roli/instancji roli VM/serwera WWW (zmniejszając obciążenie serwera) i otrzymasz zawartość typu blob bezpośrednio od pamięci masowej. Nadal możesz korzystać z aplikacji internetowej, aby zajmować się uprawnieniami, decydować, które treści dostarczyć itd. Ale ... to pozwala ci bezpośrednio połączyć się z zasobami blob, zamiast przesyłać je strumieniowo przez twój serwer sieciowy.

+0

Więcej informacji na temat wzoru klucza Valet tutaj: https://msdn.microsoft.com/en-us/library/dn568102.aspx –

+0

Muszę przyjąć podobne podejście, gdy otrzymuję błąd, aby pobrać plik z samym jego identyfikatorem URI. Dzięki za wzgląd na Davida. – Kris

7

Gdy użytkownik kliknie plik serwer odpowiada z tego

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

OGROMNE dzięki Dhananjay Kumar dla tego rozwiązania

+2

Robiąc to, zdajesz sobie sprawę, że cała zawartość obszaru blob przejdzie przez twój serwer, prawda? Oznacza to, że zawartość obiektu typu blob przenosi się z magazynu BLOB do instancji roli VM/witryny WWW/sieci, a następnie do użytkownika końcowego za pośrednictwem IIS/OWIN/itd.? –

+0

co poleciłbyś? Nie mogę zapewnić użytkownikom końcowym dostępu do całej przestrzeni dyskowej, więc eksplorator przestrzeni dyskowej Azure nie będzie działał. – stackoverfloweth

+3

Wysłałem alternatywną odpowiedź. –

Powiązane problemy