分片预览

时间:2019-01-23
本文章向大家介绍分片预览,主要包括分片预览使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

原文:java处理苹果浏览器safari无法播放视频流(Accept-Ranges)

根据自己的需求稍微改了一下

private void sendVideo(HttpServletRequest request, HttpServletResponse response, File file) {
		long contentLength = randomFile.getLength();
		String range = request.getHeader("Range");
		int start = 0, end = 0;
		if (range != null && range.startsWith("bytes=")) {
			String[] values = range.split("=")[1].split("-");
			start = Integer.parseInt(values[0]);
			if (values.length > 1) {
				end = Integer.parseInt(values[1]);
			}
		}
		int requestSize = end != 0 && end > start ? end - start + 1 : Integer.MAX_VALUE;
		response.setHeader("Content-Type", "application/pdf");
		//第一次请求只返回content length来让客户端请求多次实际数据
		if (range == null) {
			response.setHeader("Content-Length", "" + contentLength);
		} else {
			//以后的多次以断点续传的方式来返回视频数据
			//206
			response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
			long requestStart = 0, requestEnd = 0;
			String[] ranges = range.split("=");
			if (ranges.length > 1) {
				String[] rangeDatas = ranges[1].split("-");
				requestStart = Integer.parseInt(rangeDatas[0]);
				if (rangeDatas.length > 1) {
					requestEnd = Integer.parseInt(rangeDatas[1]);
				}
			}
			long length;
			if (requestEnd > 0) {
				length = requestEnd - requestStart + 1;
				response.setHeader("Content-Length", "" + length);
				response.setHeader("Content-Range", "bytes " + requestStart + "-" + requestEnd + "/" + contentLength);
			} else {
				length = contentLength - requestStart;
				response.setHeader("Content-Length", "" + length);
				response.setHeader("Content-Range", "bytes " + requestStart + "-" + (contentLength - 1) + "/" + contentLength);
			}
		}
		try (ServletOutputStream out = response.getOutputStream()) {
			BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
			inputStream.skip(start);
			int needSize = requestSize;
			byte[] buffer = new byte[4096];
			while (needSize > 0) {
				int read = inputStream.read(buffer);
				if (needSize < buffer.length) {
					out.write(buffer, 0, needSize);
				} else {
					out.write(buffer, 0, read);
				}
				needSize -= buffer.length;
			}
			inputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}