当前位置: 首页 > 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();}}}


http://www.mrgr.cn/news/10068.html

相关文章:

  • 飞睿智能10km无人机WiFi中继图传模块,视界无界,高速传输画质高清不卡顿、抗干扰
  • 基于huggingface peft进行qwen1.5-7b-chat训练/推理/服务发布
  • redis与JVM复习思维导向
  • Python | Leetcode Python题解之第371题两整数之和
  • 软件测试学习笔记丨SQL常见约束
  • C++指南-标准库,数学库,数据结构
  • 用 postman 的时候如何区分服务器还是自己的问题?
  • Datawhale X 李宏毅苹果书 AI夏令营 Task1-局部极小值与鞍点+批量和动量
  • Code Practice Journal | Day51__Graph02
  • 如何发布自己的NPM包详细步骤
  • 20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并启动
  • [数据集][目标检测]瞳孔虹膜检测数据集VOC+YOLO格式8768张2类别
  • 2024最新(API 12)鸿蒙开发面试题-HarmonyOS Next
  • docker常用命令
  • Python中读取Excel最快的几种方法!
  • 解读FastAPI异步化为transformers模型打造高性能接口解析
  • Java---面向对象
  • 进程相关命令和函数
  • Linux云计算 |【第二阶段】SECURITY-DAY3
  • 伦敦金规则:止损让你有路可退