tutorial net from example asp c# asp.net-mvc azure azure-storage azure-storage-blobs

c# - net - Cómo descargar un archivo al navegador desde Azure Blob Storage



download file from azure blob storage c# (3)

Si bien el contenido de blob puede transmitirse a través de un servidor web y al usuario final a través del navegador, esta solución carga el servidor web, tanto la CPU como la NIC.

Un enfoque alternativo es proporcionar al usuario final un uri para el blob que desea descargar, al que pueden hacer clic en el contenido html. por ejemplo, https://myaccount.blob.core.windows.net/mycontainer/myblob.ext .

El problema con esto es si el contenido es privado, ya que un uri como el anterior no funcionará a menos que se utilicen blobs públicos. Para esto, puede crear una Firma de acceso compartido (o una Política almacenada en el servidor), que luego se traduce en una cadena de consulta de hash anexada al uri. Este nuevo uri sería válido por un período de tiempo determinado (10 minutos, por ejemplo).

Aquí hay un pequeño ejemplo de cómo crear un SAS para 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;

Tenga en cuenta que la hora de inicio está configurada para ser unos minutos en el pasado. Esto es para lidiar con la deriva del reloj. Aquí está el tutorial completo del cual tomé / modifiqué este ejemplo de código.

Al utilizar el acceso directo de blob, omitirá completamente su instancia de VM / rol web / instancia de sitio web (reduciendo la carga del servidor), y hará que el usuario final extraiga el contenido de blob directamente desde el almacenamiento de blob. Aún puede usar su aplicación web para gestionar los permisos, decidir qué contenido entregar, etc. Pero ... esto le permite un enlace directo a los recursos de blob, en lugar de transmitirlos a través de su servidor web.

Ya estoy listando exitosamente los archivos disponibles, pero necesitaba saber cómo podría pasar ese archivo al navegador para que un usuario lo descargue sin guardarlo necesariamente en el servidor

Así es como obtengo la lista de archivos.

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


Si usa ASP.NET (núcleo), puede transmitir el contenido al navegador sin guardar el archivo en el servidor y usar FileStreamResult, que es IActionResult sería una solución más elegante.

var stream = await blob.OpenReadAsync(); return File(stream, blob.Properties.ContentType, option);


Una vez que el usuario hace clic en un archivo, el servidor responde con esto

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

MUCHAS gracias a Dhananjay Kumar por esta solución