先来看实现效果:
有一个链接如下:
点击链接下载文件:
第一种方法: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 classDownloadTemplateServlet 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/";
@Overrideprotected voiddoGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Overrideprotected voiddoPost(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");//定义输出类型
//输入流:本地文件路径
DataInputStreamin = newDataInputStream(new FileInputStream(new File(DOWNLOAD_TEMP_FILE + filename + ".xls")));
//输出流
OutputStreamout =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 voidexportVehicleInfo(HttpServletRequest req, HttpServletResponse resp) {
String filename= req.getParameter("filename");
DataInputStreamin = null;
OutputStreamout = 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 = newDataInputStream(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();
}
}
}
}