import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import pde.ams.AmsConstants;
import pde.ams.AmsGlobals;
import pde.ams.business.action.SUsertableAction;
import pde.ams.commons.ContenType;
import pde.ams.util.AmsFunction;
/**
* 文件下载过滤器 写个Demo,方便以后Copy
*
* @author zsx
* @version
* @todo
* @History
*/
public class AttachmentFilter implements Filter {
private Logger logger = Logger.getLogger(AttachmentFilter.class);
protected FilterConfig filterConfig;
public void destroy() {
this.filterConfig = null;
}
public void setFilterConfig(final FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
String forwardURL = request.getRequestURI().substring(
request.getContextPath().length());
System.out.println("forwardURL"+forwardURL);
String method = request.getParameter("method");
String displayName = request.getParameter("displayName");
String filePath = AmsGlobals.getAmsHome()
+ AmsConstants.AMS_ROOT_ATTACHMENT_DIR
+ forwardURL.substring("/secure/attachment".length());
File m_file = new File(filePath);
if (!m_file.exists())
return; // 如果文件不存在就直接返回
String fileName = m_file.getName();
if (displayName != null && !"".equals(displayName.trim())) {
fileName = displayName;
}
InputStream input = new FileInputStream(new File(filePath)); // 得到图片的文件流
OutputStream output = response.getOutputStream();// 得到输出流
if (method != null && method.equals("online")) // 在线播放
{
onlineMedia(request, response, m_file, input, output);
} else if (method != null && method.equals("download")) // 直接下载
{
downFile(request, response, fileName, input, output);
} else {
showFile(request, response, fileName, input, output);
}
input.close();// 关闭文件流
output.close();
}
/**
* 在线媒体播放
*
* @param request
* @param response
* @param m_file
* @param input
* @param output
* @throws IOException
*/
private void onlineMedia(HttpServletRequest request,
HttpServletResponse response, File m_file, InputStream input,
OutputStream output) throws IOException {
logger.debug(request.getRemoteAddr() + "请求下载:" + m_file.getName());
long l = m_file.length();
long p = 0;
response.reset();
response.setHeader("Accept-Ranges", "bytes");
if (request.getHeader("Range") != null) {
response
.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);
String sclient = request.getHeader("Range");
sclient = sclient.substring("bytes=".length());
if (sclient.charAt(sclient.length() - 1) == '-')
sclient = sclient.substring(0, sclient.length() - 1);
p = Long.parseLong(sclient);
}
response.setHeader("Content-Length", new Long(l - p).toString());
if (p != 0) {
response.setHeader("Content-Range", "bytes " + new Long(p).toString()
+ "-" + new Long(l - 1).toString() + "/" + new Long(l).toString());
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="
+ new String(m_file.getName().getBytes(), "iso-8859-1"));
long k = 0;
int ibuffer = 65536;
byte[] bytes = new byte[ibuffer];
try {
if (p != 0)
input.skip(p);
while (k < l) {
int j = input.read(bytes, 0, ibuffer);
response.getOutputStream().write(bytes, 0, j);
response.getOutputStream().flush();
k += j;
}
logger.debug(request.getRemoteAddr() + "请求下载:" + m_file + "下载完毕");
} catch (Exception e) {
System.err.println("传输" + m_file + "失败,位置:" + k);
System.err.println(e.getMessage());
}
}
/**
* 下载普通文件
* @param request
* @param response
* @param fileName
* @param input
* @param output
* @throws IOException
*/
private void downFile(HttpServletRequest request,
HttpServletResponse response, String fileName, InputStream input,
OutputStream output) throws IOException {
BufferedOutputStream outstream = null;
BufferedInputStream inputstream = null;
response.reset();
response.setContentType("bin");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ fileName + "\"");
outstream = new BufferedOutputStream(output);
inputstream = new BufferedInputStream(input);
int len;
byte[] buff = new byte[1024];
while ((len = inputstream.read(buff, 0, buff.length)) != -1) {
outstream.write(buff, 0, len);
}
outstream.flush();
inputstream.close();
outstream.close();
}
/**
* 显示文件(jpg,gif等)
* @param request
* @param response
* @param fileName
* @param input
* @param output
* @throws IOException
*/
private void showFile(HttpServletRequest request,
HttpServletResponse response, String fileName, InputStream input,
OutputStream output) throws IOException {
ContenType m_ContenType = new ContenType();
String fileExt = fileName.substring(fileName.lastIndexOf("."));
response.setContentType(AmsFunction.ObjToStr(m_ContenType
.getContenType(fileExt.toLowerCase())));
BufferedInputStream bis = new BufferedInputStream(input);// 输入缓冲流
BufferedOutputStream bos = new BufferedOutputStream(output);// 输出缓冲流
byte data[] = new byte[4096];// 缓冲字节数
int size = 0;
size = bis.read(data);
while (size != -1) {
bos.write(data, 0, size);
size = bis.read(data);
}
bis.close();
bos.flush();// 清空输出缓冲流
bos.close();
}
public void init(FilterConfig config) throws ServletException {
this.filterConfig = config;
}
}
Java基础之文件下载过滤器
最新推荐文章于 2023-11-10 08:32:52 发布
