package com.tj.demo.utils;import lombok.extern.slf4j.Slf4j;import org.springframework.util.FileCopyUtils;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.util.UUID;@Slf4jpublic abstract class TjFileUtils { /** * 处理前端的上传文件 * * @param file 文件 * @param relativeDir 相对路径,如果指定保存路径,则使用指定路径,否则使用默认路径 * @param filename 如果指定文件名,就是使用指定文件名,否则使用UUID命名 * @return 保存的文件全路径 */ public static String handleUpFileRelativePath(MultipartFile file, String relativeDir, String filename) throws IOException { //file是一个临时文件,需要转存到指定位置,否则本次请求完成后就会被删除 //获取原始文件名 String originalFilename = file.getOriginalFilename(); //获取原始文件名的后缀 String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); //判断是否指定了文件名称 if (filename == null) { //使用UUID重新生成文件名,防止文件名称重复造成文件覆盖 filename = UUID.randomUUID().toString() + suffix; } //判断是否指定了保存路径 if (relativeDir == null) { //将文件转存到指定路径 relativeDir = "TjFiles/"; } //创建一个目录对象 File dir = new File(relativeDir); //如果目录不存在,则创建目录 if (!dir.exists()) dir.mkdirs(); //通过文件流保存,可以设置相对路径 //获取输入流 InputStream inputStream = file.getInputStream(); //设置输出流 OutputStream outputStream = new FileOutputStream(new File(relativeDir + filename)); FileCopyUtils.copy(inputStream, outputStream); return relativeDir + filename; } /** * 处理前端的上传文件 * * @param file 文件 * @param absoluteDir 绝对路径 如果指定保存路径,则使用指定路径,否则使用默认路径 * @param filename 如果指定文件名,就是使用指定文件名,否则使用UUID命名 * @return 保存的文件全路径 */ public static String handleUploadFileAbsolutePath(MultipartFile file, String absoluteDir, String filename) throws IOException { //file是一个临时文件,需要转存到指定位置,否则本次请求完成后就会被删除 //获取原始文件名 String originalFilename = file.getOriginalFilename(); //获取原始文件名的后缀 String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); //判断是否指定了文件名称 if (filename == null) { //使用UUID重新生成文件名,防止文件名称重复造成文件覆盖 filename = UUID.randomUUID().toString() + suffix; } //判断是否指定了保存路径 if (absoluteDir == null) { //将文件转存到指定路径 absoluteDir = "C:/TjFiles"; } //创建一个目录对象 File dir = new File(absoluteDir); //如果目录不存在,则创建目录 if (!dir.exists()) dir.mkdirs(); //保存文件 //transferTo只能保存到绝对路径,相对路径默认是在tomcat下的路径。 file.transferTo(new File(absoluteDir + filename)); return absoluteDir + filename; } /** * 根据url下载图片,前端可以通过该链接显示图片 * * @param response HttpServletResponse * @param url 图片的全路径 */ public static void showPictureByUrl(HttpServletResponse response, String url) { //设置响应格式 response.setContentType("image/jpeg"); try (// 把原始的字节输入流包装成高级的缓冲字节输入流 // 输入流,通过输入流读取文件内容 InputStream bis = new BufferedInputStream(new FileInputStream(new File(url))); // 把原始的字节输出流包装成高级的缓冲字节输出流 //输出流,通过输出流将文件写回浏览器,在浏览器展示图片了 OutputStream bos = new BufferedOutputStream(response.getOutputStream()); ) { // 定义一个字节数组转移数据 byte[] buffer = new byte[1024]; int len;//记录每次读取的字节数 while ((len = bis.read(buffer)) != -1) { bos.write(buffer, 0, len); //读多少,输出多少 } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 把对象保存到本地文件中 * * @param obj Java对象 * @param path 相对路径含文件名 */ public static void writeObjectToFile(Object obj, String path) { try { makeDirs(path);//如果路径里的文件夹没有,则创建文件夹 // 对象字节输出流 ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream(path)); objOut.writeObject(obj); objOut.flush(); objOut.close(); log.info("对象保存文件-成功!"); } catch (IOException e) { log.warn("对象保存文件-失败"); e.printStackTrace(); } } /** * 从指定路径中读取对象 * * @param path 文件路径含文件名 * @return 对象数据可以通过(Java对象名)Object 对应到对象数据结构中 */ public static Object readObjectFromFile(String path) { try { //创建对象字节输入流管道包装低级的字节输入流管道 ObjectInputStream objInput = new ObjectInputStream(new FileInputStream(path)); //调用对象字节输入流的反序列化方法 Object o = objInput.readObject(); objInput.close(); return o; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 判断文件夹是否存在,如果不 * * @param path 带有文件名的全路径 */ private static void makeDirs(String path) { //创建一个file对象 File file = new File(path); //获取文件夹路径 String parent = file.getParent(); //获取自己的文件夹 //如果目录不存在,则创建目录 if (parent != null) { File dir = new File(parent); if (!dir.exists()) dir.mkdirs(); } }}