Я уже давно пробую это, но, похоже, не могу найти идеальный способ сделать это документированным (или продемонстрированным) где-либо
Вот мой код; который заимствовал биты у здесь и здесь среди других мест
[HttpGet("File/{id}")]
public IActionResult Index(int id)
{
var file = Files(a => a.AttachmentId == id);
if (file != null)
{
//using Azure.Storage.Blobs (v12)
BlobServiceClient blobServiceClient = new BlobServiceClient(config.GetConnectionString("azBlobConnection"));
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(file.BlobContainer);
BlobClient blobClient = containerClient.GetBlobClient(file.FileName);
MemoryStream memory = new MemoryStream();
blobClient.DownloadTo(memory, null, new StorageTransferOptions {
InitialTransferLength = 1024 * 1024,
MaximumConcurrency = 20,
MaximumTransferLength = 4 * 1024 * 1024
});
memory.Position = 0;
string contentType;
if (!new FileExtensionContentTypeProvider().TryGetContentType(file.FileName, out contentType))
{
contentType = "application/octet-stream";
}
Response.Headers.Add(HeaderNames.ContentDisposition, new ContentDisposition
{
FileName = file.FileName,
Inline = true,
}.ToString());
return File(memory, contentType, true);
}
Response.StatusCode = 404;
return null;
}
Это наконец работает, и я получаю в браузере доступное для поиска видео, которое воспроизводится хорошо. Моя проблема сейчас, если загрузка идет медленно и, похоже, не полностью учитывает заголовки диапазона, поступающие из браузера.
Вот сетевой след от Safari:
Сказанное выше действительно означает, что файл загружается с Azure 3 раза, несмотря на данные, возвращаемые в браузер; что сделает его медленным и неэффективным ...
Кроме того, я заметил, что решение того, что мне, вероятно, нужно, приходит из параметра HttpRange
в этом методе: Download(HttpRange, BlobRequestConditions, Boolean, CancellationToken)
Моя проблема в том, что я не могу получить ответ, который можно найти, если я использую метод Download, единственный способ заставить его работать - это использовать DownloadTo(stream)
, как указано выше.
Что лучше способ сделать это ...?
Большое спасибо!