using System; using System.IO; using GxPress.Service.Interface.Video; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Net.Http.Headers; namespace GxPress.Api.AppControllers { /// /// 访问 /// [Route("/api/app/video")] [ApiController] [Authorize] public class VideoController : ControllerBase { private readonly IWebHostEnvironment _environment; private readonly IDistributedCache _cache; private readonly IVideoService videoService; private IHttpContextAccessor _contextAccessor; private HttpContext _context { get { return _contextAccessor.HttpContext; } } public VideoController(IWebHostEnvironment environment, IDistributedCache cache, IVideoService videoService, IHttpContextAccessor contextAccessor) { _environment = environment; _cache = cache; this.videoService = videoService; _contextAccessor = contextAccessor; } // /// // /// 分页视频流 // /// // /// // [HttpGet] // [AllowAnonymous] // public IActionResult GetVideo(int page) // { // try // { // var path = Common.Tools.StringUtils.GetWebRootPath(_environment.WebRootPath); // var filepath = path + "/cache/20200428/1588144602647614.mp4"; // FileInfo fileInfo = new FileInfo(filepath); // var key = $"15881446026476141.mp4{page}"; // var result = _cache.Get(key); // if (result != null) // return File(result, "application/octet-stream", fileInfo.Name); // var blength = 1024 * 1024 * 1; // byte[] bytsize = new byte[blength]; // //获取文件名后缀 // string extension = Path.GetExtension(filepath); // // // videoService.RedisVideo(filepath, bytsize, blength, "15881446026476141.mp4"); // //获取文件流 // using (FileStream stream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) // { // while (true) // { // int r = stream.Read(bytsize, 0, blength); // //如果读取到的字节数为0,说明已到达文件结尾,则退出while循 // break; // } // stream.Close(); // } // //获取后缀名 // var ext = fileInfo.Extension; // new FileExtensionContentTypeProvider().Mappings.TryGetValue(ext, out var contenttype); // var actionResult = File(bytsize, contenttype ?? "application/octet-stream", fileInfo.Name); // return actionResult; // } // catch (FileNotFoundException e) // { // throw new Common.Exceptions.BusinessException(e.Message); // } // catch (IOException e) // { // throw new Common.Exceptions.BusinessException(e.Message); // } // } /// /// 分页视频流 /// /// [HttpHead] [AllowAnonymous] public IActionResult GetVideoInfo() { try { var path = Common.Tools.StringUtils.GetWebRootPath(_environment.WebRootPath); var filepath = path + "/cache/20200529/1234.mp4"; FileInfo fileInfo = new FileInfo(filepath); byte[] bytsize = new byte[fileInfo.Length]; var ext = fileInfo.Extension; new FileExtensionContentTypeProvider().Mappings.TryGetValue(ext, out var contenttype); var actionResult = File(bytsize, contenttype ?? "application/octet-stream", fileInfo.Name); return actionResult; } catch (FileNotFoundException e) { throw new Common.Exceptions.BusinessException(e.Message); } catch (IOException e) { throw new Common.Exceptions.BusinessException(e.Message); } } /// /// 分页视频流 /// /// [HttpGet] [AllowAnonymous] public IActionResult GetVideo() { var range = Request.Headers["Range"].ToString().Replace("bytes=", ""); try { var path = Common.Tools.StringUtils.GetWebRootPath(_environment.WebRootPath); var filepath = path + "/cache/20200529/1234.mp4"; //var filepath = "http://localhost:83/cache/20200428/1588144602647614.mp4"; //从第3个到第12个字节,共10个字节。(0是第一个字节) var begin = int.Parse(range.Split('-')[0]); var end = int.Parse(range.Split('-')[1]); var byteLength = (end - begin)+1; var bytes = new byte[byteLength]; //var fristBytes = new byte[1024]; FileInfo fileInfo = new FileInfo(filepath); //获取后缀名 var ext = fileInfo.Extension; new FileExtensionContentTypeProvider().Mappings.TryGetValue(ext, out var contenttype); //获取文件流 StreamReader stream = new StreamReader(System.IO.File.OpenRead(filepath)); //stream.BaseStream.Read(fristBytes, 0, 1024); stream.BaseStream.Seek(begin, SeekOrigin.Begin); stream.BaseStream.Read(bytes, 0, byteLength); stream.Close(); //var newBytes = new byte[fristBytes.Length + bytes.Length]; // fristBytes.CopyTo(newBytes, 0); // bytes.CopyTo(newBytes, fristBytes.Length); _context.Response.Headers.Add(HeaderNames.AcceptRanges, "bytes"); _context.Response.Headers.Add(HeaderNames.ContentRange, $"bytes {Request.Headers["Range"].ToString()}/{fileInfo.Length}"); _context.Response.StatusCode = 206; var actionResult = File(bytes, contenttype ?? "application/octet-stream", fileInfo.Name); return actionResult; } catch (Exception ex) { throw new Common.Exceptions.BusinessException($"{ex.Message}"); } } } }