Saltar al contenido

Cómo descargar un archivo al navegador desde Azure Blob Storage

Esta división fue analizado por expertos para que tengas la garantía de la exactitud de este tutorial.

Solución:

Si bien el contenido del blob se puede transmitir a través de un servidor web y junto con el usuario final a través del navegador, esta solución pone carga en el servidor web, tanto en la CPU como en la NIC.

Un enfoque alternativo es proporcionar al usuario final un URI del blob que desea descargar, en el que pueden hacer clic en el contenido html. p.ej 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 usen blobs públicos. Para esto, puede crear una firma de acceso compartido (o política almacenada en el servidor), que luego da como resultado una cadena de consulta con hash adjunta al uri. Este nuevo uri sería válido durante 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 se establece en unos minutos en el pasado. Esto es para hacer frente a la deriva del reloj. Aquí está el tutorial completo del que tomé/modifiqué este ejemplo de código.

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

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

ENORMES gracias a Dhananjay Kumar por esta solución

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

Agradecemos que quieras añadir valor a nuestro contenido tributando tu veteranía en las reseñas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *