当前位置: 首页 > news >正文

minio 大视频观看,下载

在线观看

 /*** 下载视频文件 fileName文件路径名称  文件路径 BacketName/video/1111.mp4   需要截取桶名后面的路径  video/1111.mp4 video前面不要带/   ** @param fileName* @param request* @param response*/public  void play(String fileName, HttpServletRequest request, HttpServletResponse response) {if (StringUtils.isNotBlank(fileName)) {log.info("download:" + fileName);String range = request.getHeader("Range");log.info("current request rang:" + range);//获取文件信息// 调用statObject()来判断对象是否存在。// 如果不存在, statObject()抛出异常,// 否则则代表对象存在。StatObjectResponse statObjectResponse = null;try {statObjectResponse = client.statObject(StatObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).build());} catch (ErrorResponseException e1) {e1.printStackTrace();} catch (InsufficientDataException e1) {e1.printStackTrace();} catch (InternalException e1) {e1.printStackTrace();} catch (InvalidKeyException e1) {e1.printStackTrace();} catch (InvalidResponseException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();} catch (NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (ServerException e1) {e1.printStackTrace();} catch (XmlParserException e1) {e1.printStackTrace();}System.out.println(statObjectResponse);//开始下载位置long startByte = 0;//结束下载位置long endByte = statObjectResponse.size() - 1;log.info("文件开始位置:{},文件结束位置:{},文件总长度:{}", startByte, endByte, statObjectResponse.size());//有range的话if (StringUtils.isNotBlank(range) && range.contains("bytes=") && range.contains("-")) {range = range.substring(range.lastIndexOf("=") + 1).trim();String[] ranges = range.split("-");try {//判断range的类型if (ranges.length == 1) {//类型一:bytes=-2343if (range.startsWith("-")) {endByte = Long.parseLong(ranges[0]);}//类型二:bytes=2343-else if (range.endsWith("-")) {startByte = Long.parseLong(ranges[0]);}}//类型三:bytes=22-2343else if (ranges.length == 2) {startByte = Long.parseLong(ranges[0]);endByte = Long.parseLong(ranges[1]);}} catch (NumberFormatException e) {startByte = 0;endByte = statObjectResponse.size() - 1;log.error("Range Occur Error, Message:" + e.getLocalizedMessage());}}//要下载的长度long contentLength = endByte - startByte + 1;//文件类型String contentType = request.getServletContext().getMimeType(fileName);//解决下载文件时文件名乱码问题byte[] fileNameBytes = fileName.getBytes(StandardCharsets.UTF_8);fileName = new String(fileNameBytes, 0, fileNameBytes.length, StandardCharsets.ISO_8859_1);//各种响应头设置//支持断点续传,获取部分字节内容:response.setHeader("Accept-Ranges", "bytes");//http状态码要为206:表示获取部分内容response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);response.setContentType(contentType);response.setHeader("Last-Modified", statObjectResponse.lastModified().toString());//inline表示浏览器直接使用,attachment表示下载,fileName表示下载的文件名response.setHeader("Content-Disposition", "inline;filename=" + fileName);response.setHeader("Content-Length", String.valueOf(contentLength));//Content-Range,格式为:[要下载的开始位置]-[结束位置]/[文件总大小]response.setHeader("Content-Range", "bytes " + startByte + "-" + endByte + "/" + statObjectResponse.size());response.setHeader("ETag", "\"".concat(statObjectResponse.etag()).concat("\""));try {GetObjectResponse stream = client.getObject(GetObjectArgs.builder().bucket(statObjectResponse.bucket()).object(statObjectResponse.object()).offset(startByte).length(contentLength).build());BufferedOutputStream os = new BufferedOutputStream(response.getOutputStream());byte[] buffer = new byte[1024*40];int len;while ((len = stream.read(buffer)) != -1) {os.write(buffer, 0, len);}os.flush();os.close();response.flushBuffer();log.info("下载完毕");} catch (ClientAbortException e) {log.warn("用户停止下载:" + startByte + "-" + endByte);//捕获此异常表示拥护停止下载} catch (IOException e) {e.printStackTrace();log.error("用户下载IO异常,Message:{}", e.getLocalizedMessage());} catch (XmlParserException e1) {e1.printStackTrace();} catch (ServerException e1) {e1.printStackTrace();} catch (NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (InsufficientDataException e1) {e1.printStackTrace();} catch (InvalidKeyException e1) {e1.printStackTrace();} catch (InvalidResponseException e1) {e1.printStackTrace();} catch (ErrorResponseException e1) {e1.printStackTrace();} catch (InternalException e1) {e1.printStackTrace();}}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 游戏引擎详解——图片
  • 电脑浏览器打不开部分网页
  • WEB渗透Win提权篇-RDPFirewall
  • 【HuggingFace Transformers】BertSelfOutput 和 BertOutput源码解析
  • ARM——驱动——内核编译
  • zdppy+vue3+onlyoffice文档管理系统实战 20240825上课笔记 zdppy_cache框架增加resize清理缓存的方法
  • javascript(js)入门指南
  • 【Android】Android Studio中利用git进行协同开发
  • 杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC
  • 淘客系统源码的架构分析
  • 徐州服务器租用:高防服务器的用途有哪些?
  • 在 MyBatis 中进行一对多的连表子查询
  • thinkphp8 定时任务 addOption
  • leetcode 数组+哈希+双指针+子串+滑动窗口
  • 网络安全 DVWA通关指南 DVWA File Upload(文件上传)
  • 【Amaple教程】5. 插件
  • Elasticsearch 参考指南(升级前重新索引)
  • express + mock 让前后台并行开发
  • Git同步原始仓库到Fork仓库中
  • Promise初体验
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring-boot 启动时碰到的错误
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 码农张的Bug人生 - 初来乍到
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 十年未变!安全,谁之责?(下)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 栈实现走出迷宫(C++)
  • 《码出高效》学习笔记与书中错误记录
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 回归生活:清理微信公众号
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (第61天)多租户架构(CDB/PDB)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (南京观海微电子)——示波器使用介绍
  • (七)c52学习之旅-中断
  • (四)js前端开发中设计模式之工厂方法模式
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET DataGridView数据绑定说明
  • .NET/C# 使用反射注册事件