谷歌浏览器video标签播放视频不能拖动进度条
当前端video的src不是直接使用视频文件的地址,而是通过后台下载接口返回文件流时,后台返回流因为没为response的header设置一些参数,会在部分浏览器出现问题,比如在谷歌浏览器无法拖动进度条,因为Chrome浏览器默认请求会在 Header 添加一个Range如下:服务器要做的就是响应这个Header,所以做了Range的判断,存在则做一些处理
关键代码
String rangeString = request.getHeader("Range");
if (rangeString != null && rangeString.trim().length() > 0 && !"null".equals(rangeString)) {
long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));
response.setHeader("Content-Type", "video/mp4");
response.setContentLength(Math.toIntExact(file.length()));//10000是视频文件的大小,上传文件时都会有这些参数的
response.setHeader("Content-Range", String.valueOf(range + (file.length() - 1)));//拖动进度条时的断点,其中10000是上面的视频文件大小,改成你的就好
response.setHeader("Accept-Ranges", "bytes");
}
完整代码参考
/**
* @Description: 文件下载:以流的方式
* @Date: 2021/8/24
*/
public static String downloadFile(String filePath, HttpServletRequest request, HttpServletResponse response) {
logger.info("传入路径参数" + filePath);
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
//设置文件路径
File file = new File(filePath);
//获取文件名
String fileName = file.getName();
//转码
String encodeFileName = URLEncoder.encode(fileName, "utf-8");
logger.info("文件名" + file.getName());
/*
* 当前端video的src不是直接使用视频文件的地址,而是通过后台下载接口返回文件流时,
* 后台返回流因为没为response的header设置一些参数,
*会在部分浏览器出现问题,比如在谷歌浏览器无法拖动进度条
* Chrome浏览器默认请求会在 Header 添加一个Range如下:服务器要做的就是响应这个Header,
* 所以做了Range的判断存在则做一些处理*/
String rangeString = request.getHeader("Range");
if (rangeString != null && rangeString.trim().length() > 0 && !"null".equals(rangeString)) {
long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));
response.setHeader("Content-Type", "video/mp4");
response.setContentLength(Math.toIntExact(file.length()));//10000是视频文件的大小,上传文件时都会有这些参数的
response.setHeader("Content-Range", String.valueOf(range + (file.length() - 1)));//拖动进度条时的断点,其中10000是上面的视频文件大小,改成你的就好
response.setHeader("Accept-Ranges", "bytes");
}
//告诉浏览器输出内容为流
response.setContentType("application/octet-stream");
// 设置文件名
response.addHeader("Content-Disposition", "attachment;fileName=" + encodeFileName);
response.addHeader("Content-Length", "" + file.length());
byte[] buffer = new byte[1024];
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
os.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
logger.info("下载成功");
return null;
}