Как эффективно отправлять файлы из хранилища BLOB-объектов Azure на клиент? - PullRequest
1 голос
/ 09 июля 2019

Я храню большие мультимедийные файлы в хранилище BLOB-объектов Azure (аудио, изображения, видео), которые необходимо предварительно просмотреть в приложении веб-клиента.

В настоящее время клиент запрашивает мультимедийный файл, и мой сервер загружаетвесь большой двоичный объект в память, затем возвращает файл клиенту.

Действие контроллера

[HttpGet("[action]/{blobName}")]
public async Task<IActionResult> Audio(string blobName)
{
    byte[] byteArray = await _blobService.GetAudioAsync(blobName);
    return File(byteArray, AVHelper.GetContentType(blobName));
}

Способ загрузки службы

private async Task<byte[]> GetAudioAsync(CloudBlobContainer container, string blobName)
{
    using (MemoryStream stream = new MemoryStream())
    {
        CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
        await blob.DownloadToStreamAsync(stream);
        return stream.ToArray();
    }
}

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

Есть ли какой-нибудь рекомендуемый метод для этого?Может быть, что-то, где сервер загружает из хранилища BLOB-объектов и передает файл клиенту псевдо одновременно?Таким образом, клиенту не нужно ждать, пока сервер полностью загрузит файл, чтобы начать загрузку, и сервер сможет удалить уже переданное содержимое файла из памяти.

1 Ответ

0 голосов
/ 26 июля 2019

Чтобы сделать ответ видимым для других, я суммирую ответ в комментариях:

Рекомендуется перенаправить на URL-адрес BLOB-объекта напрямую, чтобы загрузка файла могла начаться непосредственно с клиентского компьютера, и веб-приложению не нужно загружать его для потоковой передачи или файла на сервере. Шаги:

1.Когда клиент нажимает «Загрузить», на сервер поступает запрос AJAX.

2.Код сервера выполняет необходимую проверку и возвращает URL-адрес файла хранилища Azure.

3. Код AJAX возвращает URL-адрес, возвращаемый сервером, открывает новое окно браузера и перенаправляет его на URL-адрес.

...