JSP中附件下载和浏览器查看方法

         在做CMS、BBS等系统中,会有发表文章模块,而文章中会有附件和图片,当点击附件时可能会出现保存对话框和浏览器直接打开,例如类似这样的连接:/zlgc/admin/uploadAttach/20110409/20110409145547_708.doc。这种保存或打开在不同的浏览器表现不一,当然我们也可以统一这种行为,使用J2EE中的filter,过滤每个下载连接,在给每个请求回应response的http添加这是个附件的header,就可以了,核心语句:

<%@ page contentType="application/msword;charset=utf8" %>
<!-- 以上这行设定本网页为Word格式的网页 -->
<%
   //response.setHeader("Content-disposition","inline; filename=test1.doc"); //线上浏览方式,用IE打开

  response.setHeader("Content-disposition","attachment; filename=test1.doc");//下载方式,下载,不用浏览器打开
   //以上这行设定传送到前端浏览器时的档名为test1.doc
   //就是靠这一行,让前端浏览器以为接收到一个word文档
%>

操作步骤:

1、在项目中建立普通的java文件,作为filter处理体。

2、修改filter,使其实现 javax.servlet.Filter 接口,实现接口中的三个方法 init、doFilter、destroy 。

3、 配置xml,加入filter过滤器。

      <filter>
          <filter-name>AttachFilter</filter-name>
          <filter-class>Servlet.AttachFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>AttachFilter</filter-name>
          <url-pattern>/admin/uploadAttach/*</url-pattern>
      </filter-mapping>

4、重启tomcat。

注意:filter的执行顺序是按xml中顺序。

详细java代码:

package Servlet;

import java.io.IOException;
import java.util.Date;

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;

public class AttachFilter implements Filter {
    private FilterConfig filterConfig = null;
    
    public void destroy() {
        filterConfig = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chainthrows IOException, ServletException {
        
        HttpServletRequest hreq = (HttpServletRequestrequest;  
        HttpServletResponse hresp = (HttpServletResponseresponse
        
        System.out.println(new Date() + " filter");

        String url = hreq.getRequestURI();
        String fileName = url.substring(url.lastIndexOf('/')+1);//获取要下载的文件名
        System.out.println(hreq.getRequestURI());
        System.out.println(fileName);
        hresp.setHeader("Content-disposition","attachment; filename="+fileName);
        //hresp.addHeader("Content-disposition","attachment; filename="+fileName);
        chain.doFilter(hreq, hresp);
    }

    public void init(FilterConfig arg0throws ServletException {
        this.filterConfig = arg0;
    }

}

原文地址:https://www.cnblogs.com/syxchina/p/2197243.html