123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- 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
- {
- /// <summary>
- /// 访问
- /// </summary>
- [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;
- }
- // /// <summary>
- // /// 分页视频流
- // /// </summary>
- // /// <returns></returns>
- // [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);
- // }
- // }
- /// <summary>
- /// 分页视频流
- /// </summary>
- /// <returns></returns>
- [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);
- }
- }
- /// <summary>
- /// 分页视频流
- /// </summary>
- /// <returns></returns>
- [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}");
- }
- }
-
- }
- }
|