解决 Asp.Net5 在视频文件下载预览时无法快进的问题
前情提要
https://www.cnblogs.com/puzhiwei/p/15265005.html
在解决.Net5 如何修改Content-Disposition实现在线预览的功能后,我又遇到了新的问题,那就是在预览视频文件时无法拖动进度条。我尝试了多种解决方案都没有解决这个问题,首先我先对这个问题进行了一番搜索,但是并没有发现什么解决方法。但是在Google时,我发现这个问题是一个分段下载的问题。于是我就搜索了.Net5分段下载。
果然,我找到了一些.Net5分段下载的文章。
像这个 https://www.geek-share.com/detail/2723046143.html
以及这个 https://www.cnblogs.com/tianma3798/p/13445111.html
但是都不太好用。
于是我就开始了继续搜索。
wwwroot下文件的加载
我尝试将视频文件放到.Net默认的静态文件加载目录wwwroot下,然后直接访问wwwroot里的视频文件,我发现这个是可以拖动的,并且响应头与请求头中多出了Content-Range这个信息。
MDN 上说 在HTTP协议中,响应首部 Content-Range 显示的是一个数据片段在整个文件中的位置。
那么问题就很清楚了,就是如何实现在视频传输时添加Content-Range的问题,于是我又开始了搜索 .net5 file Content-Range,别说,还真找到了一些方案
这个
https://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API-Video
还有这个
过于复杂且不知道好不好用,然后我就接着搜。
Github 的结果
于是我就在Github上找到了这个https://github.com/aspnet/Mvc/pull/6895
看了看好像就是说
return File()时如何实现分段传输文件的方法的。
看了看使用方法好像还是不太会用,不过不重要,我已经知道该搜索什么了。
enableRangeProcessing
接着搜 enableRangeProcessing 我就发现了这篇文章 https://www.cnblogs.com/tianma3798/p/13445147.html ,其中提到了enableRangeProcessing 直接设置 true 即可启用对按范围返回文件流的支持,至此问题解决。
最新代码
[Route("load")] [HttpGet] public async Task<IActionResult> DownloadFile(string path, string type) { if (string.IsNullOrEmpty(path)) { return Content("404 for not found!"); } try { // 获取文件的ContentType string fileExt = Path.GetExtension(path); var provider = new FileExtensionContentTypeProvider(); var memi = provider.Mappings[fileExt]; if (type == "inline") { Response.Headers.Add("Content-Disposition", $"inline; filename={System.Net.WebUtility.UrlEncode(Path.GetFileName(filePath))}"); return PhysicalFile(filePath, memi, true); //return File(memoryStream, memi, true); } return PhysicalFile(filePath, memi, Path.GetFileName(filePath), true); } catch (DirectoryNotFoundException e) { _logger.LogError($"文件:{path},没有找到!\n{e.Message}"); return Content("404 for not found!"); } }
总结
通过这次问题的解决,告诉我一个道理,要是一个问题一开始搜索没有什么解决方案,说不定看一下源码才是问题最好的解决方案。就能看到
enableRangeProcessing这个参数,快速的去解决这个问题。
// // 摘要: // Returns the file specified by physicalPath (Microsoft.AspNetCore.Http.StatusCodes.Status200OK) // with the specified contentType as the Content-Type. This supports range requests // (Microsoft.AspNetCore.Http.StatusCodes.Status206PartialContent or Microsoft.AspNetCore.Http.StatusCodes.Status416RangeNotSatisfiable // if the range is not satisfiable). // // 参数: // physicalPath: // The path to the file. The path must be an absolute path. // // contentType: // The Content-Type of the file. // // enableRangeProcessing: // Set to true to enable range requests processing. // // 返回结果: // The created Microsoft.AspNetCore.Mvc.PhysicalFileResult for the response.
版权信息
- 解决用ASP.NET下载文件时,文件名为乱码的问题
- 解决Godaddy主机asp.net无法上传文件的问题
- Asp.net生成l文件并下载-----解决使用迅雷下载页面而不是文件的问题
- [asp.net]解决下载文件--中文名乱码问题
- asp.net生成和下载的vcard文件无法导入问题分析
- asp.net 解决下载文件–中文名乱码问题
- 【转】彻底解决Asp.net文件下载(Response.WriteFile)时文件名的中文乱码和空格异常问题
- Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
- 解决用ASP.NET下载文件时,文件名为乱码的问题
- 【原】Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
- Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
- Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
- Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
- Asp.net输出Excel文件并且下载该文件以及某些细节问题解决
- 解决Godaddy主机asp.net无法上传文件的问题
- Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
- 如何解决ASP.NET下载时的中文文件名乱码,与TXT文件中存在代码两个问题
- 从其他项目复制cs类文件到新项目后无法引用问题解决方法(开发环境vs2010,asp.net项目)
- Asp.net生成Excel文件并下载(解决使用迅雷下载页面而不是文件的问题)
- Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)