package cc.mrbird.febs.common.core.utils; import cc.mrbird.febs.common.core.exception.FebsException; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Dict; import lombok.extern.slf4j.Slf4j; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.Date; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @Slf4j public class MyUtil { public static void downloadFile(File file, HttpServletResponse response) throws IOException { try (InputStream fin = new FileInputStream(file); ServletOutputStream out = response.getOutputStream()) { response.setCharacterEncoding("utf-8"); response.setContentType("application/x-download"); response.addHeader("Content-Disposition", "attachment;filename=resume.doc"); byte[] buffer = new byte[1024]; int bytesToRead = -1; // 通过循环将读入的Word文件的内容输出到浏览器中 while ((bytesToRead = fin.read(buffer)) != -1) { out.write(buffer, 0, bytesToRead); } } catch (Exception e) { log.error("下载文件异常" + e); e.printStackTrace(); } } public static void download(HttpServletRequest request, HttpServletResponse response, List files , List fileName){ //设置压缩包的名字 //解决不同浏览器压缩包名字含有中文时乱码的问题 String downloadName ="PersonnelInformation-" + DateUtil.format(new Date(), "yyyyMMddhhmmsss") + ".zip"; String agent = request.getHeader("USER-AGENT"); try { if (agent.contains("MSIE") || agent.contains("Trident")) { downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8"); } else { downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1"); } } catch (Exception e) { e.printStackTrace(); } response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\""); //设置压缩流:直接写入response,实现边压缩边下载 ZipOutputStream zipos = null; try { zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream())); //设置压缩方法 zipos.setMethod(ZipOutputStream.DEFLATED); } catch (Exception e) { log.error("设置压缩流出现异常" + e); e.printStackTrace(); } //循环将文件写入压缩流 DataOutputStream os = null; for (int i = 0; i < files.size(); i++) { File file = files.get(i); try { //添加ZipEntry,并ZipEntry中写入文件流 //这里,加上i是防止要下载的文件有重名的导致下载失败 zipos.putNextEntry(new ZipEntry(fileName.get(i))); os = new DataOutputStream(zipos); InputStream is = new FileInputStream(file); byte[] b = new byte[100]; int length; while ((length = is.read(b)) != -1) { os.write(b, 0, length); } is.close(); zipos.closeEntry(); } catch (IOException e) { log.error("循环将文件写入压缩流出现异常" + e.getMessage()); e.printStackTrace(); } } //关闭流 try { os.flush(); os.close(); zipos.close(); } catch (IOException e) { log.error("关闭流现异常" + e.getMessage()); e.printStackTrace(); } } public static Dict filesUpload(MultipartFile file, String uploadPpath, String nextIdStr) throws FebsException, IOException { if (file.isEmpty()) { throw new FebsException("上传的文件不能为空!请重新上传"); } if (file.getSize() <= 0) { throw new FebsException("上传的文件大小需要大于0kb"); } if (file.getSize() > 50 * 1024* 1024) { throw new FebsException("上传的文件大于50M"); } if (!FileUtil.exist(uploadPpath)) { FileUtil.mkdir(uploadPpath); } //原本名字 String fileName = file.getOriginalFilename(); String suffix = ""; if (fileName.indexOf(".") > 0) { //后缀 suffix = fileName.substring(fileName.indexOf("."), fileName.length()); } //生成新的名字 String newName = nextIdStr + suffix; //上传 file.transferTo(new File(uploadPpath + newName)); return Dict.create().set("fileName",fileName).set("suffix",suffix).set("newName",newName); } }