1. package com.tj.demo.utils;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.util.FileCopyUtils;
    4. import org.springframework.web.multipart.MultipartFile;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.*;
    7. import java.util.UUID;
    8. @Slf4j
    9. public abstract class TjFileUtils {
    10. /**
    11. * 处理前端的上传文件
    12. *
    13. * @param file 文件
    14. * @param relativeDir 相对路径,如果指定保存路径,则使用指定路径,否则使用默认路径
    15. * @param filename 如果指定文件名,就是使用指定文件名,否则使用UUID命名
    16. * @return 保存的文件全路径
    17. */
    18. public static String handleUpFileRelativePath(MultipartFile file, String relativeDir, String filename) throws IOException {
    19. //file是一个临时文件,需要转存到指定位置,否则本次请求完成后就会被删除
    20. //获取原始文件名
    21. String originalFilename = file.getOriginalFilename();
    22. //获取原始文件名的后缀
    23. String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
    24. //判断是否指定了文件名称
    25. if (filename == null) {
    26. //使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
    27. filename = UUID.randomUUID().toString() + suffix;
    28. }
    29. //判断是否指定了保存路径
    30. if (relativeDir == null) {
    31. //将文件转存到指定路径
    32. relativeDir = "TjFiles/";
    33. }
    34. //创建一个目录对象
    35. File dir = new File(relativeDir);
    36. //如果目录不存在,则创建目录
    37. if (!dir.exists()) dir.mkdirs();
    38. //通过文件流保存,可以设置相对路径
    39. //获取输入流
    40. InputStream inputStream = file.getInputStream();
    41. //设置输出流
    42. OutputStream outputStream = new FileOutputStream(new File(relativeDir + filename));
    43. FileCopyUtils.copy(inputStream, outputStream);
    44. return relativeDir + filename;
    45. }
    46. /**
    47. * 处理前端的上传文件
    48. *
    49. * @param file 文件
    50. * @param absoluteDir 绝对路径 如果指定保存路径,则使用指定路径,否则使用默认路径
    51. * @param filename 如果指定文件名,就是使用指定文件名,否则使用UUID命名
    52. * @return 保存的文件全路径
    53. */
    54. public static String handleUploadFileAbsolutePath(MultipartFile file, String absoluteDir, String filename) throws IOException {
    55. //file是一个临时文件,需要转存到指定位置,否则本次请求完成后就会被删除
    56. //获取原始文件名
    57. String originalFilename = file.getOriginalFilename();
    58. //获取原始文件名的后缀
    59. String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
    60. //判断是否指定了文件名称
    61. if (filename == null) {
    62. //使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
    63. filename = UUID.randomUUID().toString() + suffix;
    64. }
    65. //判断是否指定了保存路径
    66. if (absoluteDir == null) {
    67. //将文件转存到指定路径
    68. absoluteDir = "C:/TjFiles";
    69. }
    70. //创建一个目录对象
    71. File dir = new File(absoluteDir);
    72. //如果目录不存在,则创建目录
    73. if (!dir.exists()) dir.mkdirs();
    74. //保存文件
    75. //transferTo只能保存到绝对路径,相对路径默认是在tomcat下的路径。
    76. file.transferTo(new File(absoluteDir + filename));
    77. return absoluteDir + filename;
    78. }
    79. /**
    80. * 根据url下载图片,前端可以通过该链接显示图片
    81. *
    82. * @param response HttpServletResponse
    83. * @param url 图片的全路径
    84. */
    85. public static void showPictureByUrl(HttpServletResponse response, String url) {
    86. //设置响应格式
    87. response.setContentType("image/jpeg");
    88. try (// 把原始的字节输入流包装成高级的缓冲字节输入流
    89. // 输入流,通过输入流读取文件内容
    90. InputStream bis = new BufferedInputStream(new FileInputStream(new File(url)));
    91. // 把原始的字节输出流包装成高级的缓冲字节输出流
    92. //输出流,通过输出流将文件写回浏览器,在浏览器展示图片了
    93. OutputStream bos = new BufferedOutputStream(response.getOutputStream());
    94. ) { // 定义一个字节数组转移数据
    95. byte[] buffer = new byte[1024];
    96. int len;//记录每次读取的字节数
    97. while ((len = bis.read(buffer)) != -1) {
    98. bos.write(buffer, 0, len); //读多少,输出多少
    99. }
    100. } catch (FileNotFoundException e) {
    101. e.printStackTrace();
    102. } catch (IOException e) {
    103. e.printStackTrace();
    104. }
    105. }
    106. /**
    107. * 把对象保存到本地文件中
    108. *
    109. * @param obj Java对象
    110. * @param path 相对路径含文件名
    111. */
    112. public static void writeObjectToFile(Object obj, String path) {
    113. try {
    114. makeDirs(path);//如果路径里的文件夹没有,则创建文件夹
    115. // 对象字节输出流
    116. ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream(path));
    117. objOut.writeObject(obj);
    118. objOut.flush();
    119. objOut.close();
    120. log.info("对象保存文件-成功!");
    121. } catch (IOException e) {
    122. log.warn("对象保存文件-失败");
    123. e.printStackTrace();
    124. }
    125. }
    126. /**
    127. * 从指定路径中读取对象
    128. *
    129. * @param path 文件路径含文件名
    130. * @return 对象数据可以通过(Java对象名)Object 对应到对象数据结构中
    131. */
    132. public static Object readObjectFromFile(String path) {
    133. try {
    134. //创建对象字节输入流管道包装低级的字节输入流管道
    135. ObjectInputStream objInput = new ObjectInputStream(new FileInputStream(path));
    136. //调用对象字节输入流的反序列化方法
    137. Object o = objInput.readObject();
    138. objInput.close();
    139. return o;
    140. } catch (Exception e) {
    141. e.printStackTrace();
    142. return null;
    143. }
    144. }
    145. /**
    146. * 判断文件夹是否存在,如果不
    147. *
    148. * @param path 带有文件名的全路径
    149. */
    150. private static void makeDirs(String path) {
    151. //创建一个file对象
    152. File file = new File(path);
    153. //获取文件夹路径
    154. String parent = file.getParent(); //获取自己的文件夹
    155. //如果目录不存在,则创建目录
    156. if (parent != null) {
    157. File dir = new File(parent);
    158. if (!dir.exists()) dir.mkdirs();
    159. }
    160. }
    161. }