第一种情况:已经知道文件在服务器上的具体地址,那直接把这个地址返回给前台,把值塞到href里:
<a href="地址" id="file" target="_blank"><button type="button" id="downLoadBtn">下载</button></a>
$("#file").attr('href',地址);//把地址塞进去,点击下载按钮的时候会直接下载,或者访问文件</span>
或者不设置按钮,直接在回调函数成功后load:window.location.href="地址";
第二种情况:要先生成文件,然后在把文件以流的形式返回,页面会判断处理来下载;
那就要先生成一个临时路径及文件:
File temp = File.createTempFile("fileName", ".xlsx");
absolutePath = temp.getAbsolutePath();//获取的是绝对路径
再往这个文件中写内容,这个就不说了,因人而异,我是生成的excel文件,可以参考我之前的博客http://blog.csdn.net/qq_33142257/article/details/52412385
FileOutputStream outputStream = new FileOutputStream(absolutePath);//只要把其中的路径换成这个绝对路径
File file = new File(absolutePath);//这边也是
这样一来文件已经生成好了,页写入内容了,然后把这个文件名和绝对路径存入session:
File temp = File.createTempFile("fileName", ".xlsx");
absolutePath = temp.getAbsolutePath();//获取的是绝对路径
再往这个文件中写内容,这个就不说了,因人而异,我是生成的excel文件,可以参考我之前的博客http://blog.csdn.net/qq_33142257/article/details/52412385
FileOutputStream outputStream = new FileOutputStream(absolutePath);//只要把其中的路径换成这个绝对路径
File file = new File(absolutePath);//这边也是
这样一来文件已经生成好了,页写入内容了,然后把这个文件名和绝对路径存入session:
import javax.servlet.http.HttpSession;返回到页面的回调函数中:
@RequestMapping("/download")
@ResponseBody
public ApiResponse downLoad(@RequestParam(value = "ids[]", required = false)String[] ids,@RequestParam(value = "suiteIds[]", required = false)String[] suiteIds,HttpSession session){
FileInfo file = testCaseProductService.downLoad(ids,suiteIds);//上面的那些操作我都放在service中处理了,然后返回了文件名和路径,封装在我定义的<span style="font-family: Arial, Helvetica, sans-serif;">FileInfo 这个model中</span>
session.setAttribute("path", file.getPath());//把文件名和路径存入session中
session.setAttribute("name", file.getName());
return new ApiResponse(200, "success", "");//这边起始不要要renturn什么,主要是返回后执行回调函数
}
$.post("/testcaseproduct/download", { "ids": ids ,"suiteIds":suiteIds}, function(response){NewFile.jsp:
window.location.href="/testcaseproduct/NewFile";//再去访问下载文件的jsp
});
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder"%>
<%@ page import="java.io.*"%>
<%@ page import="javax.servlet.http.HttpSession"%>
<%
response.reset();//可以加也可以不加
response.setContentType("application/octet-stream");
System.out.println(session.getAttribute("path"));
String filedownload = (String)session.getAttribute("path");//取之前存入的session
String filedisplay = (String)session.getAttribute("name")+".xlsx";
filedisplay = URLEncoder.encode(filedisplay, "UTF-8");
response.addHeader("Content-Disposition", "attachment;filename="+ filedisplay);
java.io.OutputStream outp = null;
java.io.FileInputStream in = null;
try {
outp = response.getOutputStream();
in = new FileInputStream(filedownload);
byte[] b = new byte[1024];
int i = 0;
while ((i = in.read(b)) > 0) {
outp.write(b, 0, i);
}
//
outp.flush();
out.clear();
out = pageContext.pushBody();
} catch (Exception e) {
System.out.println("Error!");
e.printStackTrace();
} finally {
if (in != null) {
in.close();
in = null;
}
}
%>
这个是行的通的,可以直接拿这个jsp测试,随便在本机找个文件,把文件名和路径放进去,直接访问这个jsp,浏览器就会下载这个文件,但是在项目中却不下载,f12会发现出现这行:
Resource interpreted as Document but transferred with MIME type application/octet-stream: "http://localhost:8090/testcaseproduct/NewFile".这是由于chrome问题,不允许访问本地的文件,如果你复制里面的连接http://localhost:8090/testcaseproduct/NewFile,打开一个新的浏览器窗口,把链接粘进去,回车就会有文件下载,那样就是成功的,这个问题不用处理,当项目发布到服务器上时就不会出现这个问题了;因为用户在登录系统点击下载时,文件是生成在服务器中的,而下载到的是用户的电脑上的;
这个jsp的作用就是读取服务器上的文件,然后以流的形式读取,通过response返回给页面,页面会识别这个流,通过这个response.setContentType("application/octet-stream");设定的格式,来下载生成这个文件