springboot整合jsp文件下载
这个比较简单,就是一个文件模板的下载,这里只写一下,不跨域,也就是与项目在同一台服务器的文件下载,可以是项目工程里边,也可以是别的目录。
一、前端实现
<a href="#" onclick="getBookFile()" style="color: #cb2027;font-size: large;text-decoration:underline">导入模板下载</a>
function getBookFile() {
let url = '/library/file/downloadFile?fileType=' + 'book';
window.open(url, '_blank');
return false;
}
二、后台逻辑
private final String BOOK_FILE_NAME = "批量导入书籍模板.xlsx";
private final String USER_FILE_NAME = "批量导入用户模板.xlsx";
/**
* 文件下载(适用于本地或者项目根路径文件的下载)
*
* @param request
* @param response
* @return
*/
@RequestMapping("/downloadFile")
@ResponseBody
public String downloadFile(HttpServletRequest request, HttpServletResponse response) {
String fileName = "";
//获取文件类型 导入用户、导入书籍
String fileType = ParamUtils.getString(request, "fileType", "");
if ("user".equals(fileType)) {
fileName = USER_FILE_NAME;
} else {
fileName = BOOK_FILE_NAME;
}
log.info("获取文件名称:" + fileName);
String path = request.getSession().getServletContext().getRealPath("/") + "templates";
if (fileName != null) {
//设置文件路径
File file = new File(path + "/" + fileName);
if (file.exists()) {
// 设置强制下载不打开
response.setContentType("application/force-download");
//设置文件编码
response.setCharacterEncoding("UTF-8");
try {
//文件名转码
String encodenickname = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + new String(encodenickname.getBytes("UTF-8"), "ISO8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] buffer = new byte[2048];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
log.info("\"文件下载成功!\\n文件名:%s,\\n文件路径:%s\", fileName,file.getAbsolutePath()");
return String.format("\"文件下载成功!\\n文件名:%s", fileName);
} catch (Exception e) {
e.printStackTrace();
} finally { // 做关闭操作
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return "下载失败";
}
因为,我这里是下载模板文件,用户模块和书籍模块都有,所以加了一个判断。
三、文件路径
这里附上文件路径,上面代码也有写出,文件路径。
四、页面效果
点击“导入模板下载”,就会下载下来
下面是文件打开的效果:
此篇文章,只是自己在练习一个(毕设)小项目时所做,所以不管是页面还是逻辑都比较简单,但是基本和正常开发是一样的 ,只为有需要的人,欢迎一起学习探讨!!!