效果如下:
1.controller层:
@ApiOperation("导出用户数据")
@GetMapping(value = "/download")
public void download(HttpServletResponse response, SafeCaseDto safeCaseDto) throws IOException {
//每页条数设置为-1,是查询全部
PageVO pageVO = new PageVO();
pageVO.setSize(-1);
Result<IPage<SafeCaseDto>> pageResult = getAll(safeCaseDto, pageVO);
List<SafeCaseDto> safeCaseDtoList= pageResult.getData().getRecords();
eSafeCaseService.download(safeCaseDtoList, response);
}
@ApiOperation("查询所有案例")
@GetMapping
public Result<IPage<SafeCaseDto>> getAll( SafeCaseDto safeCase,PageVO pageVO){
IPage<SafeCaseDto> all=eSafeCaseService.getAll(safeCase,pageVO);
System.out.println(safeCase);
return Result.success(all);
}
SafeCaseDto中存的是前端页面展示的数据
2.service层
@Override
public IPage<SafeCaseDto> getAll(SafeCaseDto safeCase,PageVO pageVO) {
return eSafeCaseMapper.getAll(pageVO.buildPage(),query);
}
@Override
public void download(List<SafeCaseDto> safeCaseDtoList, HttpServletResponse response) throws IOException {
if (CollectionUtil.isEmpty(safeCaseDtoList)) {
throw new BadRequestException(ResultEnum.FILE_DOWNLOAD_FAIL_NOT_DATA);
}
List<Map<String, Object>> list = new ArrayList<>();
for(SafeCaseDto safeCaseDto:safeCaseDtoList){
Map<String, Object> map = new LinkedHashMap<>();
map.put("标题",safeCaseDto.getTitle());
map.put("关键词",safeCaseDto.getKeywords());
map.put("类型",safeCaseDto.getSafeName());
map.put("案例封面",safeCaseDto.getPicPath());
map.put("点赞数",safeCaseDto.getTags());
map.put("案例内容",safeCaseDto.getContent());
list.add(map);
}
FileUtils.downloadExcel(list, response);
}
FileUtils类:
(参考smpe框架的编写)
/**
* File工具类,扩展 hutool 工具包
*/
public class FileUtils extends cn.hutool.core.io.FileUtil {
/**
* 定义GB的计算常量
*/
private static final int GB = 1024 * 1024 * 1024;
/**
* 定义MB的计算常量
*/
private static final int MB = 1024 * 1024;
/**
* 定义KB的计算常量
*/
private static final int KB = 1024;
/**
* 格式化小数
*/
private static final DecimalFormat DF = new DecimalFormat("0.00");
/**
* MultipartFile转File
*/
public static File toFile(MultipartFile multipartFile) {
// 获取文件名
String fileName = multipartFile.getOriginalFilename();
// 获取文件后缀
String prefix = "." + getExtensionName(fileName);
File file = null;
try {
// 用uuid作为文件名,防止生成的临时文件重复
file = File.createTempFile(IdUtil.simpleUUID(), prefix);
// MultipartFile to File
multipartFile.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
/**
* 获取文件扩展名,不带 .
*/
public static String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > - 1) && (dot < (filename.length() - 1))) {
return filename.substring(dot + 1);
}
}
return filename;
}
/**
* Java文件操作 获取不带扩展名的文件名
*/
public static String getFileNameNoEx(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > - 1) && (dot < (filename.length()))) {
return filename.substring(0, dot);
}
}
return filename;
}
/**
* 文件大小转换
*/
public static String getSize(long size) {
String resultSize;
if (size / GB >= 1) {
//如果当前Byte的值大于等于1GB
resultSize = DF.format(size / (float) GB) + "GB ";
} else if (size / MB >= 1) {
//如果当前Byte的值大于等于1MB
resultSize = DF.format(size / (float) MB) + "MB ";
} else if (size / KB >= 1) {
//如果当前Byte的值大于等于1KB
resultSize = DF.format(size / (float) KB) + "KB ";
} else {
resultSize = size + "B ";
}
return resultSize;
}
/**
* inputStream 转 File
*/
public static File inputStreamToFile(InputStream ins, String name) throws Exception {
File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);
if (file.exists()) {
return file;
}
OutputStream os = new FileOutputStream(file);
int bytesRead;
int len = 8192;
byte[] buffer = new byte[len];
while ((bytesRead = ins.read(buffer, 0, len)) != - 1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
return file;
}
/**
* 将文件名解析成文件的上传路径
*/
public static File upload(MultipartFile file, String filePath) {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
String name = getFileNameNoEx(file.getOriginalFilename());
String suffix = getExtensionName(file.getOriginalFilename());
String nowStr = "-" + format.format(date);
String fileName = null;
try {
//拼接uuid,防止在高并发情况下,出现文件名重复的情况
String uuid = UUID.randomUUID().toString();
uuid = uuid.replace("-", "");
fileName = uuid + nowStr + "." + suffix;
String path = filePath + fileName;
// getCanonicalFile 可解析正确各种路径
File dest = new File(path).getCanonicalFile();
// 检测是否存在目录
if (! dest.getParentFile().exists()) {
//不存在,创建目录
dest.getParentFile().mkdirs();
}
// 文件写入
file.transferTo(dest);
return dest;
} catch (IOException e) {
System.out.println("Could not store file " + fileName);
e.printStackTrace();
}
return null;
}
/**
* 获取UUId的方法
* */
public static String getUUID(){
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
String nowStr = "-" + format.format(date);
String uuid = UUID.randomUUID().toString();
uuid = uuid.replace("-", "");
return uuid;
}
public static File upload(MultipartFile file, String filePath,String uuid) {
String name = getFileNameNoEx(file.getOriginalFilename());
String suffix = getExtensionName(file.getOriginalFilename());
String fileName = null;
try {
//拼接uuid,防止在高并发情况下,出现文件名重复的情况
fileName = uuid + "." + suffix;
String path = filePath + fileName;
// getCanonicalFile 可解析正确各种路径
File dest = new File(path).getCanonicalFile();
// 检测是否存在目录
if (! dest.getParentFile().exists()) {
//不存在,创建目录
dest.getParentFile().mkdirs();
}
// 文件写入
file.transferTo(dest);
return dest;
} catch (IOException e) {
System.out.println("Could not store file " + fileName);
e.printStackTrace();
}
return null;
}
/**
* description: 加载文件
*/
public static Resource loadFileAsResource(String filePath) {
try {
Path path = Paths.get(filePath).normalize();
Resource resource = new UrlResource(path.toUri());
if (resource.exists()) {
return resource;
} else {
System.out.println("File not found " + filePath);
}
} catch (MalformedURLException ex) {
System.out.println("File not found " + filePath);
ex.printStackTrace();
}
return null;
}
public static String fileToBase64(File file) throws Exception {
FileInputStream inputFile = new FileInputStream(file);
String base64;
byte[] buffer = new byte[(int) file.length()];
inputFile.read(buffer);
inputFile.close();
base64 = Base64.encode(buffer);
return base64.replaceAll("[\\s*\t\n\r]", "");
}
/**
* 导出excel
*/
public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException {
String tempPath = System.getProperty("java.io.tmpdir") + IdUtil.fastSimpleUUID() + ".xlsx";
File file = new File(tempPath);
BigExcelWriter writer = ExcelUtil.getBigWriter(file);
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(list, true);
//response为HttpServletResponse对象
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition", "attachment;filename=file.xlsx");
ServletOutputStream out = response.getOutputStream();
// 终止后删除临时文件
file.deleteOnExit();
writer.flush(out, true);
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
@Deprecated
public static String getFileType(String type) {
String documents = "txt doc pdf ppt pps xlsx xls docx";
String music = "mp3 wav wma mpa ram ra aac aif m4a";
String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg";
String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg";
if (image.contains(type)) {
return "图片";
} else if (documents.contains(type)) {
return "文档";
} else if (music.contains(type)) {
return "音乐";
} else if (video.contains(type)) {
return "视频";
} else {
return "其他";
}
}
public static boolean checkSize(long maxSize, long size) {
// 1M
int len = 1024 * 1024;
if (size > (maxSize * len)) {
return false;
}
return true;
}
/**
* 判断两个文件是否相同
*/
public static boolean check(File file1, File file2) {
String img1Md5 = getMd5(file1);
String img2Md5 = getMd5(file2);
return img1Md5.equals(img2Md5);
}
/**
* 判断两个文件是否相同
*/
public static boolean check(String file1Md5, String file2Md5) {
return file1Md5.equals(file2Md5);
}
private static byte[] getByte(File file) {
// 得到文件长度
byte[] b = new byte[(int) file.length()];
try {
InputStream in = new FileInputStream(file);
try {
in.read(b);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return b;
}
private static String getMd5(byte[] bytes) {
// 16进制字符
char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(bytes);
byte[] md = mdTemp.digest();
int j = md.length;
char[] str = new char[j * 2];
int k = 0;
// 移位 输出字符串
for (byte byte0 : md) {
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 下载文件
*
* @param request /
* @param response /
* @param file /
*/
public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file,
boolean deleteOnExit) {
response.setCharacterEncoding(request.getCharacterEncoding());
response.setContentType("application/octet-stream");
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
IOUtils.copy(fis, response.getOutputStream());
response.flushBuffer();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
if (deleteOnExit) {
file.deleteOnExit();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static String getMd5(File file) {
return getMd5(getByte(file));
}
/**
* description: 判断文件是不是图片
*
*/
public static boolean isImage(MultipartFile multipartFile) {
return verifyImageByIo(multipartFile) && verifyImageByByte(multipartFile);
}
/**
* description: 通过ImageIO读取文件,判断文件是不是图片
*/
private static boolean verifyImageByIo(MultipartFile multipartFile) {
BufferedImage bi = null;
try {
bi = ImageIO.read(multipartFile.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
return bi != null;
}
/**
* description: 通过byte(hutool工具包的方法),判断文件是不是图片
*
*/
private static boolean verifyImageByByte(MultipartFile multipartFile) {
String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg";
String type = null;
try {
type = FileTypeUtil.getType(multipartFile.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
assert type != null;
return image.contains(type);
}
}