java通过超链接和servlet配置实现服务器文件下载

  1、在页面上面我们可以简单的写成:

<td align="center"">
<a href="<c:url value="/bbsfile?filename=20150417.XLS&saveasfilename=template.xls"/>">下载导入模板</a>
</td> 

 2、在web.xml里面配置servlet向Java类的跳转:

  <servlet>
    <servlet-name>bbsfile</servlet-name>
    <servlet-class>com.zl.common.downloadfile</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>bbsfile</servlet-name>
    <url-pattern>/bbsfile</url-pattern>
  </servlet-mapping>

  3、编写下载文件的Java类:

/*
 * Created on 2004-12-22
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.zl.common;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.activation.FileTypeMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cd.util.ReadPropertiesFile;
import com.zl.base.core.Constants;

public class downloadfile extends HttpServlet {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    /**
     * Default constructor.
     */
    public downloadfile() {
        super();
    }

    /**
     * Init method.
     * 
     * @throws ServletException
     *             never.
     */
    public void init() throws ServletException {
        return;
    }

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        service(request, response, true);
    }

    public void service(HttpServletRequest request, HttpServletResponse response, boolean blnsyn)
            throws ServletException, IOException {
        try {
            Object user = request.getSession().getAttribute(Constants.SESSION_USER);

            if (user != null) {
                String mimeType = request.getParameter("mimeType");
                String filename = request.getParameter("filename");
                String oldfilename = request.getParameter("saveasfilename");
                if (mimeType!=null)    response.setContentType(mimeType);
                if (oldfilename == null) {
                        response.setHeader("Content-Disposition", "attachment; filename=" + filename);
                } else {
                    oldfilename = new String(oldfilename.getBytes("ISO-8859-1"),"UTF-8");;
                    response.setHeader("Content-Disposition", "attachment; filename="+ oldfilename );
                    // response.setHeader("Content-Disposition", "attachment;
                    // filename=" +oldfilename);
                }
                String uploadfilepath = ReadPropertiesFile.getInstance().getProperty("uploadfilepath", "c:/") + "announce/";
                File file = new File(uploadfilepath + filename);
                System.out.println("文件路径:"+uploadfilepath + filename);
                if (!file.exists()) {
                    file.createNewFile();
                }
                FileTypeMap fMap = FileTypeMap.getDefaultFileTypeMap();
                String filetype = fMap.getContentType(file);
                response.setContentType(filetype);
                response.setContentLength((int) file.length());
                BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                byte[] input = new byte[1024];
                boolean eof = false;
                while (!eof) {
                    int length = bis.read(input);
                    if (length == -1) {
                        eof = true;
                    } else {
                        bos.write(input, 0, length);
                    }
                }
                bos.flush();
                bis.close();
                bos.close();
            }
        } catch (Exception ex) {

        }
        return;
    }
    
}

  其中ReadPropertiesFile类是定义文件保存位置的方法:

package com.cd.util;

import java.io.InputStream;
import java.util.Properties;

/**
 * 读取 sale.properties文件的内容
 * 
 * @author lxk 2013-05-28 单例
 * 
 */
public class ReadPropertiesFile {
    static private ReadPropertiesFile instance = new ReadPropertiesFile(); // 唯一实例
    private Properties dbProps = null;
    
    private Properties getDbProps() {
        return dbProps;
    }
    //默认的私有的构造方法
    private ReadPropertiesFile() {
        InputStream is = ReadPropertiesFile.class.getResourceAsStream("/sale.properties");
        dbProps = new Properties();
        try {
            dbProps.load(is);
        } catch (Exception e) {
            System.err.println("不能读取属性文件. 请确保sale.properties在CLASSPATH指定的路径中");
        }
    }

    /**
     * 返回唯一实例.如果是第一次调用此方法,则创建实例
     * 
     * @return DBConnectionManager 唯一实例
     */
    public static synchronized ReadPropertiesFile getInstance() {
        if (instance == null) {
            instance = new ReadPropertiesFile();
        }
        return instance;
    }

    public String getProperty(String key, String defaultValue) {
        // 如果taglib.properties没有key,则默认defaultValue
        return instance.getDbProps().getProperty(key, defaultValue);
    }
}

  编写一个sale.properties文件,在项目里面配置服务器文件存放的路径:

##uploadfilepath=/home/webapp/sxwl_file/upload/
uploadfilepath=c:/logs/