2015-05-26 9 views
17

zum Download Ich bin bereits erfolgreich Auflistung Dateien, aber ich musste wissen, wie ich diese Datei nach unten an den Browser für einen Benutzer, ohne notwendigerweise zu Speichern an den Server zum Download passieren könnteWie man ein Datei-Browser von Azure Blob Storage

Hier ist, wie ich die Liste der Dateien zu erhalten

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

Antwort

36

Während Blob-Inhalte über einen Webserver und über den Browser zum Endbenutzer gestreamt werden können, belastet diese Lösung den Webserver, sowohl die CPU als auch die NIC.

Ein alternativer Ansatz ist es, den Anwender mit einem uri auf den gewünschten blob heruntergeladen werden zu schaffen, die sie in dem HTML-Inhalt klicken können. z.B. https://myaccount.blob.core.windows.net/mycontainer/myblob.ext.

Das Problem dabei ist, wenn der Inhalt privat ist, da ein uri wie die oben wird, es sei denn mit dem öffentlichen Blobs nicht funktionieren. Zu diesem Zweck können Sie eine Shared Access-Signatur (oder eine Server-gespeicherte Policy) erstellen, die dann zu einer Hash-Querystring führt, die an die URI angehängt wird. Diese neue URL wäre für eine bestimmte Zeitdauer gültig (z. B. 10 Minuten).

Hier ist ein kleines Beispiel für eine SAS für einen Klecks zu schaffen:

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; 

Beachten Sie, dass die Startzeit ein paar Minuten in der Vergangenheit sein wird. Dies ist mit der Taktverschiebung zu tun. Hier ist die full tutorial Ich griff/modifizierte dieses Codebeispiel aus.

Durch die Verwendung des direkten Blobzugriffs umgehen Sie Ihre VM/Webrolleninstanz/Webseinstanz vollständig (Verringerung der Serverlast) und lassen den Blobinhalt von Ihrem Endbenutzer direkt aus dem Blobspeicher abrufen. Sie können noch Ihre Web-App verwenden, um mit Permissionierung zu behandeln, zu entscheiden, welche Inhalte zu liefern, etc. Aber ... das können Sie Direktlink zu blob Ressourcen, anstatt sie über Ihren Web-Streaming-Server.

+0

Mehr über Valet Schlüsselmuster hier: https://msdn.microsoft.com/en-us/library/dn568102.aspx –

+0

Ich habe ähnlichen Ansatz zu umarmen, wenn Fehler immer eine Datei herunterzuladen, mit nur seine URI. Danke für die Köpfe hoch David. – Kris

7

Sobald der Benutzer eine Datei klickt der Server mit diesem

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

riesig dankreagiertfür diese Lösung

+2

Also, indem Sie dies tun, müssen Sie erkennen, dass der gesamte Inhalt des Blobs routet über Ihren Server, nicht wahr? Das heißt, der Inhalt des Blobs wird vom Blob-Speicher zu Ihrer VM/Website/Web-Rollen-Instanz und dann zu Ihrem Endbenutzer über IIS/OWIN/usw. weitergeleitet. –

+0

Was würden Sie empfehlen? Ich kann meinen Endbenutzern keinen Zugriff auf den gesamten Speicher geben, sodass ein Azure-Speicher-Explorer nicht funktioniert. – stackoverfloweth

+3

Ich habe eine alternative Antwort gepostet. –

Verwandte Themen