Java实现视频(mp4/flv/..)及图片(jpg/jpeg/png/..)给前端调用

本期内容总结:
在做后端开发的过程中,经常会处理到将视频或者图片返回给前端。下面将封装一种可以简单的方法,前端只需要拼接接口地址+地址链接,即可播放下载。

@GetMapping(value="/videoOrImagePlay")
@Slf4j
public void videoOrImagePlay(HttpServletRequest request,HttpServletResponse response,@RequestParam("path")String path){
	InputStream in = null;
	ServletOutputStream out = null;
	
	try{
		//文件后缀名校验
		String fileSuffix = path.subString(path.lastIndexOf(".") + 1);//文件后缀
		fileSuffix = fileSuffix.toLowerCase();
		//支持的文件后缀名白名单
		String[] suffixWhiteList = {"png","jpeg","jpg","gif","ico","pdf","zip","mp3","mp4","flv"};
		if(!Arrays.asList(suffixWhiteList).contains(fileSuffix.toLowerCase())){
			logger.error(unSupport fileType!);
			return;
		}
		//路径不能包含..
		if (path.contains("..")) {
			logger.error(error play path!);
			return;
		}

		File file = new file(path);
		int fSize = Integer.parseInt(String.valueOf(file.length()));

		//拼接响应类型参数值:图片
		StringBuilder type = new StringBuilder();
		String typeStr = type.append("image/").append(fileSuffix).toString();
		//图片白名单
		String[] suffixImageList = {"png","jpeg","jpg","gif","ico"};
		//视频白名单
		String[] suffixVideoList = {"mp3","mp4","flv"};
		
		if ("flv".equals(fileSuffix)){
			response.setContentType("flv-application/octet-stream");
		} else if(Arrays.asList(suffixImageList).contains(fileSuffix.toLowerCase())){
			response.setContentType(typeStr);
		} else{
			response.setContentType("video/mp4");
		}
		response.setHeader("Accept-Ranges","bytes");
		response.setHeader("Content-Disposition","attachment;fileName=" + path);
		response.setHeader("Access-Control-Allow-Origin","*");
		in = new FileInputStream(path);
		long pos = 0;
		if (null != request.getHeader("Range")){
			//断点续传
			response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
			try{
				pos = Long.parseLong((request.getHeader("Range").replaceAll("bytes=","").split("-")[0]));
				if (pos >= fSize){
					pos = 0;
				}
			}catch (NumberFormatException e){
				logger.error("NumberFormatException",e);
				pos = 0;
			}
		}
		out = response.getOutputStream();
		String contentRange = new StringBuffer("bytes ").append(pos + "").append("-").append((fSize - 1) + "").append(fSize() + "").toString();
		response.setHeader("Content-Range",contentRange);
		//设置响应头Content-Length,防止浏览器请求数据量超过实际文件大小
		response.setHeader("Content-Length","" + (fSize - pos));
		in.skip(pos);
		byte[] buffer = new byte[1024 * 10];
		int length = 0;
		while((length = in.read(buffer,0,buffer.length)) != -1){
			out.write(buffer,0,length);
		} 
	}catch (Exception e){
		if (org.apache.commons.lang3.StringUtils.containsIgnoreCase(ExceptionUtils.getMessage(e),"ClientAbortException")){
			logger.error("ClientAbortException");
		} else {
			logger.error("Play FileStorage Failed",e);
		}
	}finally{
		try{
			if(null != out){
				out.flush();
			}
			if(null != out){
				out.close();
			}
			if(null != in){
				in.close();
			}
			
		}catch(IOException e){
			logger.error("IOException!",e);
		}
	}
}
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值