保存文件到指定位置,读取/删除指定文件夹中文件

使用背景

用户每次上传的文件太多,如果批量处理,服务器性能不够,所以将用户上传的文件保存到服务器上,再启动一个线程,依次处理完成后删除文件

用户上传文件

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;
    }
}
相关推荐
翱翔-蓝天3 分钟前
为什么“看起来很规范”的后端项目反而臃肿且性能下降
spring boot
Maynor99619 分钟前
OpenClaw 玩家必备:用 AI 自动追踪社区最新动态
java·服务器·人工智能
堕27424 分钟前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
亓才孓38 分钟前
[Class的应用]获取类的信息
java·开发语言
开开心心就好1 小时前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
80530单词突击赢1 小时前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法1 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
云姜.2 小时前
线程和进程的关系
java·linux·jvm
是码龙不是码农2 小时前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧2 小时前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言