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;
}
}
}