使用背景
用户每次上传的文件太多,如果批量处理,服务器性能不够,所以将用户上传的文件保存到服务器上,再启动一个线程,依次处理完成后删除文件
用户上传文件
java
@PostMapping("/inFile")
public String inFile(@RequestParam("file") List<MultipartFile> listFile, @RequestParam Map<String,String> params){
// 创建临时文件夹
FileSaveClear fsc = new FileSaveClear();
fsc.createTempDirectory();
listFile.forEach(file->{
// 保存上传的文件到临时文件夹
String filePath = fsc.saveFileToTemp(file);
});
//读取到指定文件夹中的所有文件
List<MultipartFile> files = fsc.getAllTempFilesAsMultipartFiles();
//启动一个线程处理对应的文件
new Thread(()->{
System.out.println(LocalDateTime.now());
files.forEach(file->{
inFileRun(file,params);
});
//删除对应的文件
fsc.deleteAllFilesInDirectory();
System.out.println(LocalDateTime.now());
}).start();
return "inFile";
}
文件保存/读取/删除代码
java
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class FileSaveClear {
final String TEMP_FILE_PATH = System.getProperty("user.dir") + "/temp-files/";
// 创建临时文件夹
public void createTempDirectory() {
File tempDir = new File(TEMP_FILE_PATH);
if (!tempDir.exists()) {
tempDir.mkdirs();
}
}
// 保存文件到临时文件夹
public String saveFileToTemp(MultipartFile file) {
try {
String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename();
String filePath = TEMP_FILE_PATH + fileName;
File destFile = new File(filePath);
file.transferTo(destFile);
return filePath;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 删除指定文件夹中的所有文件
* @return 删除成功的文件数量
*/
public int deleteAllFilesInDirectory() {
File directory = new File(TEMP_FILE_PATH);
if (!directory.exists() || !directory.isDirectory()) {
return 0;
}
File[] files = directory.listFiles();
if (files == null) {
return 0;
}
int deletedCount = 0;
for (File file : files) {
if (file.isFile() && file.delete()) {
deletedCount++;
}
}
return deletedCount;
}
/**
* 读取临时文件夹中的所有文件,返回MultipartFile对象列表
* @return MultipartFile对象列表
*/
public List<MultipartFile> getAllTempFilesAsMultipartFiles() {
File tempDir = new File(TEMP_FILE_PATH);
if (!tempDir.exists() || !tempDir.isDirectory()) {
return new ArrayList<>();
}
File[] files = tempDir.listFiles();
if (files == null) {
return new ArrayList<>();
}
List<MultipartFile> multipartFiles = new ArrayList<>();
for (File file : files) {
if (file.isFile()) {
try {
// 读取文件内容
byte[] fileContent = java.nio.file.Files.readAllBytes(file.toPath());
// 创建MultipartFile对象 - 使用自定义实现
MultipartFile multipartFile = new MultipartFile() {
@Override
public String getName() {
return file.getName();
}
@Override
public String getOriginalFilename() {
return file.getName();
}
@Override
public String getContentType() {
// 根据文件扩展名确定内容类型
String fileName = file.getName().toLowerCase();
if (fileName.endsWith(".csv")) {
return "text/csv";
} else if (fileName.endsWith(".txt")) {
return "text/plain";
} else if (fileName.endsWith(".xlsx") || fileName.endsWith(".xls")) {
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
} else {
return "application/octet-stream";
}
}
@Override
public boolean isEmpty() {
return fileContent.length == 0;
}
@Override
public long getSize() {
return fileContent.length;
}
@Override
public byte[] getBytes() throws IOException {
return fileContent;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(fileContent);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
java.nio.file.Files.write(dest.toPath(), fileContent);
}
};
multipartFiles.add(multipartFile);
} catch (Exception e) {
System.err.println("读取文件 " + file.getName() + " 时出错: " + e.getMessage());
}
}
}
return multipartFiles;
}
}