我将大型媒体文件(音频,图像,视频)存储在Azure Blob存储中,这些文件需要在Web客户端应用程序上进行预览。
当前,客户端请求一个媒体文件,我的服务器将整个blob下载到内存中,然后将文件返回给客户端。
控制器动作
[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();
}
}
我担心这不是一个好的设计,因为该文件被串行下载两次,这将导致下载速度变慢和服务器内存使用量增加。文件大小可以为几百MB。
有一些推荐的方法吗?也许服务器正在从blob存储下载并将文件同时流传输到客户端的某种方式?因此,客户端不必等待服务器完全下载文件即可开始下载,服务器可以从内存中删除已传输的文件内容。
答案 0 :(得分:1)
为使答案对其他人可见,我在注释中总结了答案:
建议是直接重定向到Blob Url,以便文件下载可以直接开始到客户端计算机,并且Web应用程序不需要将其下载到服务器上的流或文件中。步骤:
1。当客户端单击“下载”时,服务器会收到AJAX请求。
2。服务器代码执行必要的验证,并返回Azure存储的文件URL。
3。AJAX代码获取从服务器返回的URL,并打开一个新的浏览器窗口并将其重定向到该URL。