在创建一个文件夹,名称download,先拷入要下载的一些文件
编写下载的页面,提供一些下载的超链接,点击超链接,弹出下载的窗口
编写下载的Servlet类,完成下载

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 先获取到文件的名称
    String filename = request.getParameter("filename");
    // 解决中文乱码
    filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
    // System.out.println("要下载的文件名称:"+filename);

            //设置两个头一个流
    // 设置第一个头,值可以是MIME类型,可以获取该文件的MIME类型
    String type = this.getServletContext().getMimeType(filename);
    response.setHeader("content-type",type);

    // 先获取到用户使用的浏览器的信息,根据浏览器的信息采用不同的编码,例如火狐,采用Base64编码,使用IE采用的URL编码
    // 先判断浏览器的信息
    String agent = request.getHeader("user-agent");
    // Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
    // System.out.println(agent);

    String name = null;
    if(agent.contains("Firefox")){
        // 使用是火狐,采用Base64编码
        name = base64EncodeFileName(filename);
    }else{
        // 使用的是IE或者谷歌,使用URL编码
        name = URLEncoder.encode(filename, "UTF-8");
    }
    System.out.println("编码后的内容:"+name);
    // 设置第二个头
    response.setHeader("content-disposition", "attachment;filename="+name);

    // 一个流,先获取到要下载的文件的输入流,使用response对象的输出流输出到客户端上,完成文件下载了
    // 先获取到要下载的文件的输入流,先获取到download文件夹 + filename 文件,获取文件的输入流了
    String path = this.getServletContext().getRealPath("/download");
    // System.out.println(path);
    // 获取文件的输入流
    InputStream in = new FileInputStream(path+"/"+filename);
    // 获取输出流,不能new,使用response对象
    OutputStream os = response.getOutputStream();
    byte [] b = new byte[1024];
    int len = 0;
    while((len = in.read(b)) != -1){
        os.write(b, 0, len);
    }
    in.close();
    os.close();
}

/**
 * 传入文件的名称,进行Base64编码
 * @param fileName
 * @return
 */
public String base64EncodeFileName(String fileName) {
    BASE64Encoder base64Encoder = new BASE64Encoder();
    try {
        return "=?UTF-8?B?"
                + new String(base64Encoder.encode(fileName
                        .getBytes("UTF-8"))) + "?=";
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}