package com.sm.common.servlet; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.util.UriUtils;
import com.sm.common.config.Global; /**
* 查看CK上传的图片
* @author ThinkGem
* @version 2014-06-25
*/
public class UserfilesDownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L;
private Logger logger = LoggerFactory.getLogger(getClass()); public void fileOutputStream(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filepath = request.getRequestURI();
int index = filepath.indexOf(Global.USERFILES_BASE_URL);
if (index >= ) {
filepath = filepath.substring(index + Global.USERFILES_BASE_URL.length());
}
try {
filepath = UriUtils.decode(filepath, "UTF-8");
} catch (UnsupportedEncodingException e1) {
logger.error(String.format("解释文件路径失败,URL地址为%s", filepath), e1);
}
File file = new File(Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL + filepath);
logger.debug("===" + Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL + filepath + "===");
RandomAccessFile randomFile = new RandomAccessFile(file, "r");// 只读模式
long contentLength = randomFile.length();
String range = request.getHeader("Range");
int start = , end = ;
if (range != null && range.startsWith("bytes=")) {
String[] values = range.split("=")[].split("-");
start = Integer.parseInt(values[]);
if (values.length > ) {
end = Integer.parseInt(values[]);
}
}
int requestSize = ;
if (end != && end > start) {
requestSize = end - start + ;
} else {
requestSize = Integer.MAX_VALUE;
} byte[] buffer = new byte[];
response.setContentType("video/mp4");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("ETag", file.getName());
response.setHeader("Last-Modified", new Date().toString());
// 第一次请求只返回content length来让客户端请求多次实际数据
if (range == null) {
response.setHeader("Content-length", contentLength + "");
} else {
// 以后的多次以断点续传的方式来返回视频数据
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//
long requestStart = , requestEnd = ;
String[] ranges = range.split("=");
if (ranges.length > ) {
String[] rangeDatas = ranges[].split("-");
requestStart = Integer.parseInt(rangeDatas[]);
if (rangeDatas.length > ) {
requestEnd = Integer.parseInt(rangeDatas[]);
}
}
long length = ;
if (requestEnd > ) {
length = requestEnd - requestStart + ;
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 - ) + "/" + contentLength);
}
}
OutputStream out = response.getOutputStream();
try { int needSize = requestSize;
randomFile.seek(start);
while (needSize > ) {
int len = randomFile.read(buffer);
if (needSize < buffer.length) {
out.write(buffer, , needSize);
} else {
out.write(buffer, , len);
if (len < buffer.length) {
break;
}
}
needSize -= buffer.length;
}
} catch (FileNotFoundException e) {
request.setAttribute("exception", new FileNotFoundException("请求的文件不存在"));
request.getRequestDispatcher("/WEB-INF/views/error/404.jsp").forward(request, response);
} catch (Exception e1) {
request.setAttribute("exception", e1);
request.getRequestDispatcher("/WEB-INF/views/error/404.jsp").forward(request, response);
} finally {
randomFile.close();
out.close();
} } public void fileOutputStream2(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String filepath = req.getRequestURI();
int index = filepath.indexOf(Global.USERFILES_BASE_URL);
if (index >= ) {
filepath = filepath.substring(index + Global.USERFILES_BASE_URL.length());
}
try {
filepath = UriUtils.decode(filepath, "UTF-8");
} catch (UnsupportedEncodingException e1) {
logger.error(String.format("解释文件路径失败,URL地址为%s", filepath), e1);
}
File file = new File(Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL + filepath);
try {
if (filepath.endsWith(".mp4")) {
resp.setContentType("video/mpeg4; charset=utf-8");
resp.setHeader("Content-disposition", "attachment;filename=" + file.getName());
} else {
resp.setHeader("Content-Type", "application/octet-stream");
}
FileCopyUtils.copy(new FileInputStream(file), resp.getOutputStream()); return;
} catch (FileNotFoundException e) {
req.setAttribute("exception", new FileNotFoundException("请求的文件不存在"));
req.getRequestDispatcher("/WEB-INF/views/error/404.jsp").forward(req, resp);
} catch (Exception e1) {
req.setAttribute("exception", e1);
req.getRequestDispatcher("/WEB-INF/views/error/404.jsp").forward(req, resp);
}
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
fileOutputStream(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
fileOutputStream(req, resp);
}
}