我们项目中有时需要从数据库中获取数据,将这些数据生成临时文件存储服务器中,再由用户端下载,在下载完毕后还要删除生成的临时文件。
因为ajax是二进制的返回形式,而下载数据需要以流的形式,所以我这里选择以超链接的方式进入到后台;具体代码如下:
<a href="<%=path%>/sys/troubles/exportFile.do?id=<%=path%>${bean.id}" id="link" >下载文件</a>
后台代码:
public void exportFile(HttpServletRequest request,HttpServletResponse response){
String id = request.getParameter("id");
Map<String,Object> map= new TroublesServiceImpl().exportFile(id);
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
String path = request.getSession().getServletContext().getRealPath("/files");//获取webroot文件下的files文件夹路径
Template t = null;
try {//在服务器中生成临时文件
configuration.setDirectoryForTemplateLoading(new File(path)); //FTL文件所存在的位置
t = configuration.getTemplate( File.separator + "trouble_model.ftl","UTF-8"); //文件名;File.separator:获取当前系统的路径斜杠
String fileName = map.get("station")+"-"+map.get("title")+".doc";//导出的文件名为:油站名-故障主题
String savePath = path +File.separator + fileName;//保存到服务器端文件的路径
File outFile = new File(savePath);
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
Writer out = new BufferedWriter(osw);
t.process(map, out);
if (fos != null){
fos.close();
}
if(osw != null){
osw.close();
}
if(out != null){
out.close();
}
//控制浏览器下载
File file = new File(savePath);//savePath:是服务器存储临时文件的路径,记得带上文件名
if(file.exists()){
response.setContentType("application/x-msdownload");
//设置头信息
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));//fileName:下载后的文件名。记得设置utf-8,不然文件名为乱码
InputStream inputstrem = new FileInputStream(file);
ServletOutputStream outputstream = response.getOutputStream();
byte b[] = new byte[1024];//每次下载1024个字节
int n;
while((n = inputstrem.read(b)) != -1){//当后面还有字节时,继续循环下载
outputstream.write(b,0,n);
}
outputstream.close();//关闭流
inputstrem.close();
}else{
request.setAttribute("errorResult", "文件不存在,下载失败!");//设置失败信息
RequestDispatcher dispatcher = req.getRequestDispatcher("/sc.jsp");//当下载失败后,重定向到这个页面
dispatcher.forward(req, resp);
}
File deleteFile=new File(savePath); //删除服务器上的临时文件
deleteFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}