package com.ruoyi.web.controller.tool;
|
|
import org.springframework.web.multipart.MultipartFile;
|
import java.io.*;
|
import java.nio.file.Files;
|
|
|
/**
|
* @author RainbowCloud
|
*/
|
public class MyFileUtil {
|
|
/**
|
* 将 File 转换为 MultipartFile。
|
*
|
* @param file 要转换的文件
|
* @param fieldName 字段名,通常用于表单中的文件字段名
|
* @return 转换后的 MultipartFile
|
* @throws IOException 如果发生I/O错误
|
*/
|
public static MultipartFile fileToMultipartFile(File file, String fieldName) throws IOException {
|
try {
|
if (file == null || !file.exists()) {
|
throw new FileNotFoundException("文件未找到:" + file);
|
}
|
byte[] content = Files.readAllBytes(file.toPath());
|
return new ByteArrayMultipartFile(content, file.getName(), fieldName, Files.probeContentType(file.toPath()));
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
} finally {
|
// 删除临时文件
|
file.delete();
|
}
|
}
|
|
/**
|
* 将 MultipartFile 转换为 File。
|
*
|
* @param multipartFile 要转换的 MultipartFile
|
* @return 转换后的 File
|
* @throws IOException 如果发生I/O错误
|
*/
|
public static File multipartFileToFile(MultipartFile multipartFile) throws IOException {
|
if (multipartFile.isEmpty()) {
|
throw new IOException("传入的MultipartFile为空");
|
}
|
String originalFilename = multipartFile.getOriginalFilename();
|
String tempFileSuffix = originalFilename != null ? originalFilename.substring(originalFilename.lastIndexOf('.')) : ".tmp";
|
File tempFile = File.createTempFile("temp", tempFileSuffix);
|
try (InputStream ins = multipartFile.getInputStream();
|
OutputStream os = new FileOutputStream(tempFile)) {
|
byte[] buffer = new byte[8192];
|
int bytesRead;
|
while ((bytesRead = ins.read(buffer)) != -1) {
|
os.write(buffer, 0, bytesRead);
|
}
|
}
|
return tempFile;
|
}
|
|
/**
|
* 内置一个简单的 MultipartFile 实现类,用于File转换
|
*/
|
private static class ByteArrayMultipartFile implements MultipartFile {
|
private final byte[] content;
|
private final String name;
|
private final String originalFilename;
|
private final String contentType;
|
|
/**
|
* 构造函数
|
*
|
* @param content 文件内容
|
* @param originalFilename 文件原始名字
|
* @param name 字段名
|
* @param contentType 文件类型
|
*/
|
public ByteArrayMultipartFile(byte[] content, String originalFilename, String name, String contentType) {
|
this.content = content;
|
this.originalFilename = originalFilename;
|
this.name = name;
|
this.contentType = contentType;
|
}
|
|
@Override
|
public String getName() {
|
return this.name;
|
}
|
|
@Override
|
public String getOriginalFilename() {
|
return this.originalFilename;
|
}
|
|
@Override
|
public String getContentType() {
|
return this.contentType;
|
}
|
|
@Override
|
public boolean isEmpty() {
|
return (this.content == null || this.content.length == 0);
|
}
|
|
@Override
|
public long getSize() {
|
return this.content.length;
|
}
|
|
@Override
|
public byte[] getBytes() {
|
return this.content;
|
}
|
|
@Override
|
public InputStream getInputStream() {
|
return new ByteArrayInputStream(this.content);
|
}
|
|
@Override
|
public void transferTo(File dest) throws IOException, IllegalStateException {
|
try (OutputStream os = new FileOutputStream(dest)) {
|
os.write(this.content);
|
}
|
}
|
}
|
|
}
|