private void play(File downloadFile ,HttpServletRequest request, HttpServletResponse response ){try {if (!downloadFile.exists()) {response.sendError(HttpServletResponse.SC_NOT_FOUND);return;}long fileLength = downloadFile.length();// 记录文件大小long pastLength = 0;// 记录已下载文件大小int rangeSwitch = 0;// 0:从头开始的全文下载;1:从某字节开始的下载(bytes=27000-);2:从某字节开始到某字节结束的下载(bytes=27000-39000)long contentLength = 0;// 客户端请求的字节总量String rangeBytes = "";// 记录客户端传来的形如“bytes=27000-”或者“bytes=27000-39000”的内容RandomAccessFile raf = null;// 负责读取数据OutputStream os = null;// 写出数据OutputStream out = null;// 缓冲int bsize = 1024;// 缓冲区大小byte b[] = new byte[bsize];// 暂存容器String range = request.getHeader("Range");int responseStatus = 206;if (range != null && range.trim().length() > 0 && !"null".equals(range)) {// 客户端请求的下载的文件块的开始字节responseStatus = javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT;System.out.println("request.getHeader(\"Range\")=" + range);rangeBytes = range.replaceAll("bytes=", "");if (rangeBytes.endsWith("-")) {rangeSwitch = 1;rangeBytes = rangeBytes.substring(0, rangeBytes.indexOf('-'));pastLength = Long.parseLong(rangeBytes.trim());contentLength = fileLength - pastLength;} else {rangeSwitch = 2;String temp0 = rangeBytes.substring(0, rangeBytes.indexOf('-'));String temp2 = rangeBytes.substring(rangeBytes.indexOf('-') + 1, rangeBytes.length());pastLength = Long.parseLong(temp0.trim());}} else {contentLength = fileLength;// 客户端要求全文下载}// 清除首部的空白行response.reset();// 告诉客户端允许断点续传多线程连接下载,响应的格式是:Accept-Ranges: bytesresponse.setHeader("Accept-Ranges", "bytes");// 如果是第一次下,还没有断点续传,状态是默认的 200,无需显式设置;响应的格式是:HTTP/1.1if (rangeSwitch != 0) {response.setStatus(responseStatus);// 不是从最开始下载,断点下载响应号为206// 响应的格式是:// Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]switch (rangeSwitch) {case 1: {String contentRange = new StringBuffer("bytes ").append(new Long(pastLength).toString()).append("-").append(new Long(fileLength - 1).toString()).append("/").append(new Long(fileLength).toString()).toString();response.setHeader("Content-Range", contentRange);break;}case 2: {String contentRange = range.replace("=", " ") + "/"+ new Long(fileLength).toString();response.setHeader("Content-Range", contentRange);break;}default: {break;}}} else {String contentRange = new StringBuffer("bytes ").append("0-").append(fileLength - 1).append("/").append(fileLength).toString();response.setHeader("Content-Range", contentRange);}response.setContentType("video/mp4;charset=UTF-8");response.setHeader("Content-Length", String.valueOf(contentLength));os = response.getOutputStream();out = new BufferedOutputStream(os);raf = new RandomAccessFile(downloadFile, "r");try {long outLength = 0;// 实际输出字节数switch (rangeSwitch) {case 0: {}case 1: {raf.seek(pastLength);int n = 0;while ((n = raf.read(b)) != -1) {out.write(b, 0, n);outLength += n;}break;}case 2: {raf.seek(pastLength);int n = 0;long readLength = 0;// 记录已读字节数while (readLength <= contentLength - bsize) {// 大部分字节在这里读取n = raf.read(b);readLength += n;out.write(b, 0, n);outLength += n;}if (readLength <= contentLength) {// 余下的不足 1024 个字节在这里读取n = raf.read(b, 0, (int) (contentLength - readLength));out.write(b, 0, n);outLength += n;}break;}default: {break;}}System.out.println("Content-Length为:" + contentLength + ";实际输出字节数:" + outLength);out.flush();} catch (Exception e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}if (raf != null) {try {raf.close();} catch (IOException e) {e.printStackTrace();}}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

解决h5中video标签返回流无法快进和后退的问题相关推荐

  1. 解决html5中video标签无法播放mp4问题的办法

    解决html5中video标签无法播放mp4问题的办法 参考文章: (1)解决html5中video标签无法播放mp4问题的办法 (2)https://www.cnblogs.com/it-tsz/p ...

  2. html5video标签属性,H5中video标签那些属性和方法

    前言 最近在写一个自定义播放器, 写之前我们肯定要把播放器的属性和方法全部过一遍,知彼知己,方能百战不殆嘛...后面会把自己写的播放器和踩过的一些坑也上传上来 video标签行内属性 src:视频的U ...

  3. 解决 html5 中 video 标签无法播放 m3u8

    步入正题 前段时间写项目时候遇到一个问题,在 H5 页面上无法播放 m3u8 后缀的视频,经过不断的查阅资料发现,通过一段代码可解决,但是!除非浏览器支持,否则请转码. <script src= ...

  4. 解决html中video标签因为视频编码格式不能打开视频文件的问题

    需要做一个目标检测算法的输入视频和输出视频的直观对比展示页面,在html5中采用了video标签: 但是显示无效源,应该是视频本身的问题,查看了html5的video文档: 决定去查看一下in.avi ...

  5. vue3-video-play视频组件的使用(一)——基本使用 HTML5中Video标签的属性、方法和事件汇总

    vue3-video-play视频组件的使用(一)--基本使用 & HTML5中Video标签的属性.方法和事件汇总 npm地址:https://www.npmjs.com/package/v ...

  6. php video标签使用方法,HTML_HTML5 video标签(播放器)学习笔记(一):使用入门,近有在学习html5中video标签(播 - phpStudy...

    HTML5 video标签(播放器)学习笔记(一):使用入门 近有在学习html5中video标签(播放器)的使用,这里做一些学习笔记,方便自己查阅和记录,本文是第一篇,将介绍的是使用该标签初始化该做 ...

  7. 解决安卓微信video标签标签劫持

    解决安卓微信video标签标签劫持 需求 期望网页中的video标签,不在安卓微信中被劫持播放. 代码 可能视频地址失效,换个视频地址,再测试. <!DOCTYPE html> <h ...

  8. echarts饼图解析html标签,解决echarts中饼图标签重叠的问题

    饼图中的series有个avoidLabelOverlap属性, avoidLabelOverlap:是否启用防止标签重叠策略,默认开启,在标签拥挤重叠的情况下会挪动各个标签的位置,防止标签间的重叠. ...

  9. HTML5新增的video标签,HTML5中video标签的使用方法

    HTML5中video标签的使用方法 发布时间:2020-08-27 11:33:56 来源:亿速云 阅读:100 作者:小新 这篇文章将为大家详细讲解有关HTML5中video标签的使用方法,小编觉 ...

最新文章

  1. 加强数据中心安全的六条措施
  2. 怎么在html中加入pjax,pjax加载多说的三种方法
  3. 计算机专业课程群建设,计算机科学与技术专业课程群建设的研究与实践
  4. 互联网日报 | 4月7日 星期三 | 雷军称小米首款汽车售价10至30万;携程通过港交所上市聆讯;深交所主板与中小板正式合并...
  5. 可变悬挂调节软硬_国六最亲民的豪车,丐版2.0T纯进口,全系可变悬架+8气囊,才23万...
  6. PDA地下电缆巡检系统
  7. eclipse maven 打war包的几种方式
  8. php 字符编码转换
  9. 使用rapid-framework继承jsp页面
  10. python反编译_反编译 python
  11. webim--web端即时通讯的实现
  12. 统计年鉴 付费下载 夏泽网
  13. ZZULIOJ:1055: 兔子繁殖问题
  14. 与 BGI 绘图库的兼容情况
  15. Dataset:White Wine Quality白葡萄酒品质数据集的简介、下载、使用方法之详细攻略
  16. @Scheduled出现Unexpected error occurred in scheduled task
  17. 第六天 02.mysql数据库的基本操作和密码爆破
  18. logstash-plugin install报错message: certificate verify failed
  19. Java中如何实现一个函数返回多个值
  20. 7-139 手机话费 (10分)

热门文章

  1. S7-1200PLC求数组里数据最大值最小值FB块
  2. Python seaborn.barplot绘图将纵轴设置成百分比形式
  3. 2022-02-13 机器学习基本概念
  4. mac机c4d更改语言,Win/Mac版:C4D R18 三维软件 Cinema 4D C4D R18 正式完整版 + 中文/英文注册机版...
  5. 七、jQuery动画特效(二)
  6. 【自动驾驶行业观察】奥迪A8自动驾驶功能剖析
  7. 一统iOS跟macOS,未来办公靠手机?
  8. 什么叫换位思考!(太透彻了)
  9. 推荐系统详解(三)近邻推荐
  10. php做网站半成品,两小时学会用php做网站购物车