效果是这样,前端一点下载可以下载后台生成文件的。
首先是前台的显示,调用后台的下载url:
<div class="form-inline ml10">
<a class="btn btn-default" href="/servlet/DownLoadServlet">下载建表sql</a>
</div>
在web.xml中配置一下url的位置,主要的意思是把控制下载的类名和对应的url对应上:
<servlet>
<servlet-name>DownLoadServlet</servlet-name>
<servlet-class>com.jd.data.manage.controller.DownLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownLoadServlet</servlet-name>
<url-pattern>/servlet/DownLoadServlet</url-pattern>
</servlet-mapping>
然后是文件生成部分的代码,收到flag提示之后生成文件:
@RequestMapping(value = "/ar_monitor_sql_generate/download/ajax", method = RequestMethod.POST)
public void downloadFile(RerunSqlGenerateInfo obj,HttpServletRequest request,HttpServletResponse response) throws IOException {
String flag = request.getParameter("flag");
String filename = "create_sql.sql";
String filepath;
filepath = request.getSession().getServletContext().getRealPath("/WEB-INF/uploads/"+filename);
File file = new File(filepath);
logger.info(file.getAbsolutePath());
file.createNewFile();
FileWriter fileWriter = new FileWriter(file);
String create_sql = this.rerunSqlGenerateInfo.getCreate_sql();
String insert_sql = this.rerunSqlGenerateInfo.getInsert_sql();
fileWriter.write(create_sql);
fileWriter.close();
}
servlet下载文件逻辑:
package com.jd.data.manage.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
public class DownLoadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = "create_sql.sql";
String filepath = request.getSession().getServletContext().getRealPath("/WEB-INF/uploads/"+filename);
//通过文件名找出文件的所在目录
//得到要下载的文件
File file = new File(filepath);
//如果文件不存在
if(!file.exists()){
request.setAttribute("message", "您要下载的资源已被删除!!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
FileInputStream in = new FileInputStream(filepath);
OutputStream out = response.getOutputStream();
byte buffer[] = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
/**
* @Method: findFileSavePathByFileName
* @Description: 通过文件名和存储上传文件根目录找出要下载的文件的所在路径
* @param filename 要下载的文件名
* @param saveRootPath 上传文件保存的根目录,也就是/WEB-INF/upload目录
* @return 要下载的文件的存储目录
*/
public String findFileSavePathByFileName(String filename,String saveRootPath){
int hashcode = filename.hashCode();
int dir1 = hashcode&0xf; //0--15
int dir2 = (hashcode&0xf0)>>4; //0-15
String dir = saveRootPath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
File file = new File(dir);
if(!file.exists()){
//创建目录
file.mkdirs();
}
return dir;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这样就可以了