private void sendVideo(HttpServletRequest request, HttpServletResponse response, File file, String fileName) throwsFileNotFoundException, IOException {
RandomAccessFile randomFile= new RandomAccessFile(file, "r");//只读模式
long contentLength =randomFile.length();
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 = 0;if(end != 0 && end >start){
requestSize= end - start + 1;
}else{
requestSize=Integer.MAX_VALUE;
}byte[] buffer = new byte[4096];
response.setContentType("video/mp4");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("ETag", fileName);
response.setHeader("Last-Modified", newDate().toString());//第一次请求只返回content length来让客户端请求多次实际数据
if(range == null){
response.setHeader("Content-length", contentLength + "");
}else{//以后的多次以断点续传的方式来返回视频数据
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//206
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 = 0;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);
}
}
ServletOutputStream out=response.getOutputStream();int needSize =requestSize;
randomFile.seek(start);while(needSize > 0){int len =randomFile.read(buffer);if(needSize
out.write(buffer,0, needSize);
}else{
out.write(buffer,0, len);if(len
}
}
needSize-=buffer.length;
}
randomFile.close();
out.close();
}