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 sun.misc.BASE64Decoder; 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() > 200 * 1024* 1024) { throw new FebsException("上传的文件大于200M"); } if (!FileUtil.exist(uploadPpath)) { FileUtil.mkdir(uploadPpath); } //原本名字 String fileName = file.getOriginalFilename(); String suffix = ""; if (fileName.lastIndexOf(".") > 0) { //后缀 suffix = fileName.substring(fileName.lastIndexOf(".")); } //生成新的名字 String newName = nextIdStr + suffix; //上传 file.transferTo(new File(uploadPpath + newName)); return Dict.create().set("fileName",fileName).set("suffix",suffix).set("newName",newName); } public static Dict filesUpload(MultipartFile file, String uploadPpath) throws FebsException, IOException { if (file.isEmpty()) { throw new FebsException("上传的文件不能为空!请重新上传"); } if (file.getSize() <= 0) { throw new FebsException("上传的文件大小需要大于0kb"); } if (file.getSize() > 200 * 1024* 1024) { throw new FebsException("上传的文件大于200M"); } if (!FileUtil.exist(uploadPpath)) { FileUtil.mkdir(uploadPpath); } //原本名字 String fileName = file.getOriginalFilename(); String suffix = ""; if (fileName.lastIndexOf(".") > 0) { //后缀 suffix = fileName.substring(fileName.lastIndexOf(".")); } if(FileUtil.exist(uploadPpath + fileName)){ throw new FebsException("文件已经存在"); } //上传 file.transferTo(new File(uploadPpath + fileName)); return Dict.create().set("fileName",fileName).set("suffix",suffix); } /** * 对字节数组字符串进行Base64解码并生成图片 */ public static boolean generateImage(String imgStr,String url) { if (imgStr == null) { // 图像数据为空 return false; } imgStr = imgStr.split(",")[1]; BASE64Decoder decoder = new BASE64Decoder(); try { // Base64解码 byte[] b = decoder.decodeBuffer(imgStr); for (int i = 0; i < b.length; ++i) { // 调整异常数据 if (b[i] < 0) { b[i] += 256; } } // 生成jpeg图片 String imgFilePath = url; OutputStream out = new FileOutputStream(imgFilePath); out.write(b); out.flush(); out.close(); return true; } catch (Exception e) { return false; } } /** * 将base64字符串,生成文件 */ public static File convertBase64ToFile(String fileBase64String, String filePath, String fileName) { BufferedOutputStream bos = null; FileOutputStream fos = null; File file = null; try { File dir = new File(filePath); if (!dir.exists() && dir.isDirectory()) {//判断文件目录是否存在 dir.mkdirs(); } BASE64Decoder decoder = new BASE64Decoder(); byte[] bfile = decoder.decodeBuffer(fileBase64String); file = new File(filePath + File.separator + fileName); fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(bfile); return file; } catch (Exception e) { e.printStackTrace(); return null; } finally { if (bos != null) { try { bos.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } }