如何有效地将文件从Azure Blob存储发送到客户端?

时间:2019-07-09 00:42:50

标签: c# asp.net-core azure-storage-blobs

我将大型媒体文件(音频,图像,视频)存储在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存储下载并将文件同时流传输到客户端的某种方式?因此,客户端不必等待服务器完全下载文件即可开始下载,服务器可以从内存中删除已传输的文件内容。

1 个答案:

答案 0 :(得分:1)

为使答案对其他人可见,我在注释中总结了答案:

建议是直接重定向到Blob Url,以便文件下载可以直接开始到客户端计算机,并且Web应用程序不需要将其下载到服务器上的流或文件中。步骤:

1。当客户端单击“下载”时,服务器会收到AJAX请求。

2。服务器代​​码执行必要的验证,并返回Azure存储的文件URL。

3。AJAX代码获取从服务器返回的URL,并打开一个新的浏览器窗口并将其重定向到该URL。