SpringMVC的上传下载功能
1 上传excel格式文件:
前台页面
<form method="post" action="/import/upload" enctype="multipart/form-data">
<input class="easyui-filebox" name="empFile" data-options="prompt:'请选择文件',buttonText:'选择文件',buttonIcon:'icon-reload'" style="width:300px">
<button class="easyui-linkbutton" iconCls="icon-redo">导入</button>
<a class="easyui-linkbutton" href="/import/empStencil">下载模版</a>
<x-sign style="font-size: 50px">${ERROR_IN_SESSION}</x-sign>
</form>
后台页面
@RequestMapping("/upload")
public String upload(MultipartFile empFile, HttpServletResponse response, HttpServletRequest request) throws Exception{
ImportParams params = new ImportParams();
ServletContext servletContext = request.getServletContext();
String xlsx="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
String xls="application/vnd.ms-excel";
String contentType = empFile.getContentType();
//如果不是表格类型的
if(!xlsx.equals(contentType)&&!xls.equals(contentType)){
//直接返回
request.getSession().setAttribute("MESSAGE_IN_SESSION", "错误---请选择表格类型的文件");
return "import";
}
//设置标题占的行数
params.setTitleRows(1);
//设置表头占的行数
params.setHeadRows(1);
//设置导入需要验证
params.setNeedVerfiy(true);
//设置自己的验证规则
params.setVerifyHandler(employeeIExcelVerifyHandler);
//发现部门无法显示----因为没有id--只将部门名称传递过来了
//先通过部门名称找到部门----然后设置id进去
/*List<Employee> list = ExcelImportUtil.importExcel(
empFile.getInputStream(),
Employee.class, params);*/
ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore(
empFile.getInputStream(),
Employee.class, params);
//得到错误的列表
List<Employee> failList = result.getFailList();
//得到正确的列表
List<Employee> list = result.getList();
list.forEach(e->{
//设置部门
e.setDepartment(departmentService.findByName(e.getDepartment().getName()));
//设置员工的初始密码
e.setPassword(e.getUsername());
//保存正确的用户
employeeService.save(e);
});
//判断是否有失败的验证数据
if(result.isVerfiyFail()){
//得到失败数据的工作薄
Workbook failWorkbook = result.getFailWorkbook();
//设置返回的文件类型---需要response取返回---xslx
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//设置导出的文件名
response.setHeader("Content-disposition", "attachment;filename=error.xlsx");
//设置不缓存
response.setHeader("Pragma", "No-cache");
//得到一个输出流
ServletOutputStream outputStream = response.getOutputStream();
failWorkbook.write(outputStream);
outputStream.close();
failWorkbook.close();
}
request.getSession().setAttribute("MESSAGE_IN_SESSION", "选择文件正确");
return "import";
}
}
2 下载:
前台只需要想写一个a标签
后台代码:
/*下载模版*/
@RequestMapping("/empStencil")
public ResponseEntity<byte[]> download(HttpServletRequest request)throws Exception {
//得到项目真实路径
String realPath = request.getServletContext().getRealPath("");
File file = new File(realPath,"employee.xlsx");
HttpHeaders headers = new HttpHeaders();
//下载显示的文件名,解决中文名称乱码问题
String downloadFielName = new String("employee.xlsx".getBytes("UTF-8"),"iso-8859-1");
// 通知浏览器以attachment(下载方式)打开图片
headers.setContentDispositionFormData("attachment", downloadFielName);
//application/octet-stream : 二进制流数据(最常见的文件下载)。
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
return responseEntity;
}