我目前正在 ASP.NET Core 3 中构建 API,作为我使用 .NET Core 的第一个项目。
我目前正在尝试将视频发送到我的 React.js 前端以在浏览器中观看。上传文件和视频确实可以正常工作,您在下面看到的方法也已经将文件发送到客户端,但如果视频长度超过几秒,则视频播放器非常慢,并且也需要很长时间才能跳过视频的几秒钟。我认为这是因为文件首先被完全下载然后播放。
[Route("getFileById")]
public FileResult getFileById(int fileId)
{
var context = new DbContext();
var file = context.File.Find(fileId);
if (file == null)
{
Console.WriteLine("file " + fileId + " not found");
return null;
}
var content = new FileStream(file.Name, FileMode.Open, FileAccess.Read, FileShare.Read);
var response = File(content, "application/octet-stream");
return response;
}
我认为解决我的问题的方法是流式传输文件而不是将其作为一个整体发送。
我已经在 google 上搜索过如何使用 ASP.NET Core 3 流式传输视频,但我只找到了针对 ASP.NET Core 2 进行解释的网站(例如http://anthonygiretti.com/2018/01/16/streaming-video-asynchronously-in-asp-net-core-2-with-web-api/ http://anthonygiretti.com/2018/01/16/streaming-video-asynchronously-in-asp-net-core-2-with-web-api/)
我已经尝试使用这些网站上的代码,但他们的方式与 ASP.NET Core 3 不兼容。
如何在 ASP.NET Core 3 中流式传输文件?
如果您想在浏览器中流式传输视频,您的服务器应该支持HTTP 范围请求 https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests。在这种情况下,服务器只能发送客户端请求的内容的一小部分。当您想在浏览器中流式传输视频时,您可以使用video
使用范围标头请求内容的 html 标签。因此,您也可以跳过一些时间,在电影完全下载之前立即从该位置播放电影。
ASP.NET Core 3已经支持HTTP范围请求,它的实现是PhysicalFile
具有属性的方法启用范围处理。正如文档所说:
返回由physicalPath(Status200OK)指定的文件,
指定 contentType 作为 Content-Type,并且指定
fileDownloadName 作为建议的文件名。这支持范围
请求(Status206PartialContent 或 Status416RangeNotSatisfiable,如果
范围不能满足)。
[Route("getFileById")]
public FileResult getFileById(int fileId)
{
...
return PhysicalFile($"C:/movies/{file.Name}", "application/octet-stream", enableRangeProcessing: true);
}
请注意,路径必须是绝对路径(而不是相对路径)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)