先来看实现效果:
有一个链接如下:
点击链接下载文件:
第一种方法:Servlet实现
一、HTML页面部分:
1、HTML页面中的一个链接
2、引入JS
function download(){ downloadTemplate('downloadExel.downloadexcel', 'filename', 'project');}/** * 用于下载导入模板时的影藏form表单的提交,采用post方式提交 * @param action action映射地址 * @param type parameter的名称 * @param value parameter的值,这里为file的filename */function downloadTemplate(action, type, value){ var form = document.createElement('form'); document.body.appendChild(form); form.style.display = "none"; form.action = action; form.id = 'excel'; form.method = 'post'; var newElement = document.createElement("input"); newElement.setAttribute("type","hidden"); newElement.name = type; newElement.value = value; form.appendChild(newElement); form.submit();}
3、解释上面JS(不是正是代码)
相当于提交一个form,里面如下:
后台可以通过下面代码获得文件名:project
String filename = request.getParameter("filename");
(这段是上面js的翻译,不是正式的哦)
二、配置部分
配置前台页面和后台交互
1、web.xml配置
downloadServlet com.zit.rfid.app.prms.business.service.servlet.DownloadTemplateServlet 3 downloadServlet *.downloadexcel
我这个web.xml不是整个工程的web.xml,只是一个模块的,在你的web.xml加入上面servlet和servlet-mapping里的内容即可
如上:
(1)接受 *.downloadexcel 的Action
(2)HTML的JS里的Action,交给com.test.DownloadTemplateServlet这个类去处理
2、WebContent目录下新建file文件夹,存放project.xls文件 (Eclipse的Web工程有WebContent,MyEclipse好像是WebRoot)
三、后台部分
1、新建一个servlet:
DownloadTemplateServlet.java
package com.test;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * @author 0223000218 * 主要用于下载导入模板,页面上传入的request中parameter中,filename代表了要下载的模板的名称 */public class DownloadTemplateServlet extends HttpServlet { /** * serialVersionUID */ private static final long serialVersionUID = -4541729035831587727L; private final static String HOME_PATH = DownloadTemplateServlet.class.getResource("/").getPath(); private final static String DOWNLOAD_TEMP_FILE = HOME_PATH.subSequence(0, HOME_PATH.indexOf("WEB-INF")) + "file/"; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String filename = req.getParameter("filename"); try{ resp.reset();// 清空输出流 String resultFileName = filename + System.currentTimeMillis() + ".xls"; resultFileName = URLEncoder.encode(resultFileName,"UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("Content-disposition", "attachment; filename=" + resultFileName);// 设定输出文件头 resp.setContentType("application/msexcel");// 定义输出类型 //输入流:本地文件路径 DataInputStream in = new DataInputStream( new FileInputStream(new File(DOWNLOAD_TEMP_FILE + filename + ".xls"))); //输出流 OutputStream out = resp.getOutputStream(); //输出文件 int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } out.close(); in.close(); } catch(Exception e){ e.printStackTrace(); resp.reset(); try { OutputStreamWriter writer = new OutputStreamWriter(resp.getOutputStream(), "UTF-8"); String data = ""; writer.write(data); writer.close(); } catch (IOException e1) { e1.printStackTrace(); } } } }
大致步骤:
1. 获取服务器文件所在路径
2. 输入服务器文件
3. 输出文件到本地
第二种方法:SpringMVC实现
这种方法比较简单
一、JSP页面部分
和上面一样
//导出模板下载 function download(){ //后台方法、文件类型、文件名 downloadTemplate('${pageContext.request.contextPath}/cardIssueVehicleInfo/exportVehicleInfo', 'filename', 'test'); } /** * 用于下载导入模板时的影藏form表单的提交,采用post方式提交 * @param action 请求后台方法 * @param type 文件类型 * @param value 文件名 */ function downloadTemplate(action, type, value){ var form = document.createElement('form'); document.body.appendChild(form); form.style.display = "none"; form.action = action; form.id = 'excel'; form.method = 'post'; var newElement = document.createElement("input"); newElement.setAttribute("type","hidden"); newElement.name = type; newElement.value = value; form.appendChild(newElement); form.submit(); }
二、后台部分
@RequestMapping("exportVehicleInfo") public void exportVehicleInfo(HttpServletRequest req, HttpServletResponse resp) { String filename = req.getParameter("filename"); DataInputStream in = null; OutputStream out = null; try{ resp.reset();// 清空输出流 String resultFileName = filename + System.currentTimeMillis() + ".xls"; resultFileName = URLEncoder.encode(resultFileName,"UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("Content-disposition", "attachment; filename=" + resultFileName);// 设定输出文件头 resp.setContentType("application/msexcel");// 定义输出类型 //输入流:本地文件路径 in = new DataInputStream( new FileInputStream(new File(downloadPath + "test.xls"))); //输出流 out = resp.getOutputStream(); //输出文件 int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } } catch(Exception e){ e.printStackTrace(); resp.reset(); try { OutputStreamWriter writer = new OutputStreamWriter(resp.getOutputStream(), "UTF-8"); String data = ""; writer.write(data); writer.close(); } catch (IOException e1) { e1.printStackTrace(); } }finally { if(null != in) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if(null != out) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }