import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import java.io.*; /** * 将 MultipartFile 转换为 File 并保存到本地 * * @author chenwc * @date 2023/5/21 10:06 */ public class MultipartFileToFile { private static final Logger log = LoggerFactory.getLogger(MultipartFileToFile.class); /** * 将 MultipartFile 转换为 File * @param outFilePath 输出文件路径参数 * @param multiFile 参数 * @return 执行结果 */ public static File multipartFileToFile(String outFilePath, MultipartFile multiFile) { // 获取文件名 if (null == multiFile) { log.info("传入的 MultipartFile 为空!"); return null; } String fileName = multiFile.getOriginalFilename(); if (null == fileName || fileName.isEmpty()) { log.info("传入的 MultipartFile 文件名为空!"); return null; } try { File toFile; InputStream ins = multiFile.getInputStream(); //指定存储路径 toFile = writeFileByInputStream(ins, outFilePath + fileName); return toFile; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 把 InputStream 流写入本地文件(字节流) * @param inputStream InputStream 流 * @param filePath 待写入本地文件全路径+文件名 * @return File */ public static File writeFileByInputStream(InputStream inputStream, String filePath){ File file = new File(filePath); FileOutputStream fos = null; log.info("写入文件路径: {}", file.getAbsolutePath()); try { if (!file.exists()) { if (!mkdirParents(file)) { log.info("创建父级目录失败!"); return null; } if (!file.createNewFile()) { log.info("文件不存在,创建文件失败!"); return null; } else { log.info("文件不存在,创建文件成功!"); } } long start = System.currentTimeMillis(); log.info("开始写入文件............"); fos = new FileOutputStream(file); byte[] b = new byte[1024]; while ((inputStream.read(b)) != -1) { // 写入数据 fos.write(b); } long end = System.currentTimeMillis(); log.info("写入文件成功............"); log.info("写入文件耗时: {} ms", end - start); } catch (IOException e) { e.printStackTrace(); } finally { try { if (null != inputStream) { inputStream.close(); } if (null != fos) { //保存数据 fos.close(); } } catch (IOException e) { e.printStackTrace(); } } return file; } /** * 判断文件的父级目录是否存在,不存在则创建 * @param file 文件 * @return true 父级目录存在或创建父级目录成功, false创建父级目录失败 */ private static boolean mkdirParents(File file){ if (!file.getParentFile().exists()) { return file.getParentFile().mkdirs(); } else { return true; } } }