Java基础之文件下载过滤器

本文介绍了一个文件下载过滤器的实现方法,支持在线播放、直接下载及显示文件等功能。通过Servlet API实现,适用于Web应用程序中的文件管理场景。
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;
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值