Подтвердить что ты не робот

Как загрузить файл в браузер из хранилища Azure Blob

Я уже успешно показываю доступные файлы, но мне нужно знать, как я могу передать этот файл в браузер для загрузки пользователем, не обязательно сохраняя его на сервере

Вот как я получаю список файлов

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

Ответ 1

В то время как содержимое блоба может быть передано через веб-сервер, а вместе с конечным пользователем через браузер это решение загружает веб-сервер как CPU, так и NIC.

Альтернативный подход заключается в том, чтобы предоставить конечному пользователю uri желаемому загружаемому блоку, который они могут щелкнуть в html-контенте. например https://myaccount.blob.core.windows.net/mycontainer/myblob.ext.

Проблема с этим заключается в том, что содержимое является конфиденциальным, так как uri, такой как выше, не будет работать, если не использовать общедоступные капли. Для этого вы можете создать подпись общего доступа (или серверную политику), которая затем приведет к хешированию, добавленному в uri. Этот новый uri будет действителен в течение заданного периода времени (например, 10 минут).

Вот небольшой пример создания SAS для 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;

Обратите внимание, что время начала устанавливается в несколько минут в прошлом. Это касается дрифта часов. Вот полный полный учебник Я схватил/модифицировал этот образец кода из.

Используя прямой доступ к blob, вы полностью обойдете экземпляр экземпляра виртуальной машины/веб-сайта/веб-сайта (уменьшите нагрузку на сервер) и получите конечный пользовательский контент с помощью blob-содержимого непосредственно из хранилища blob. Вы все еще можете использовать свое веб-приложение, чтобы иметь дело с разрешением, решая, какой контент для доставки и т.д. Но... это позволяет вам напрямую ссылаться на ресурсы blob, а не передавать их через ваш веб-сервер.

Ответ 2

Как только пользователь нажимает на файл, сервер отвечает этим

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

HUGE благодаря Dhananjay Kumar для этого решения

Ответ 3

Если вы используете ASP.NET (ядро), вы можете передавать содержимое в браузер, не сохраняя файл на сервере, и использовать FileStreamResult, который является IActionResult, и это было бы более элегантным решением.

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