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

使用背景

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

用户上传文件

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;
    }
}
相关推荐
geovindu几秒前
java: Task Scheduler
java·开发语言·后端
神奇小梵5 分钟前
java的特殊语法点,与常规语言相异的点
java·开发语言
loser.with.m5 分钟前
【AgentScope 2.0】8-MCP 集成:Agent 的「USB-C 接口」是怎么接的
人工智能·spring boot·agentscope
代码不停16 分钟前
Spring Boot 配置文件
spring boot·后端
无巧不成书021820 分钟前
Tomcat 下载后使用全指南:解压、环境配置、启动验证与常见问题排查
java·tomcat
Wang's Blog24 分钟前
Java框架快速入门: Spring Security+OAuth2之多因子认证缓存服务
java·spring·缓存
RuoyiOffice36 分钟前
SpringBoot3+Vue3 招聘 Offer:发出、审批通过、转入职怎么走完
spring boot·vue3·offer·入职·spring boot 3·hrm·招聘管理
wuminyu37 分钟前
Kafka配置TLS/SSL加密传输时零拷贝失效分析
java·linux·c语言·jvm·c++
边境悍匪42 分钟前
蜗牛学苑 Java 智能体学习 Day41|ElementPlus 布局、Vue‑Router 登录、Axios 思维导图复盘
java·vue.js·学习
IT_陈寒44 分钟前
为什么我的Java Stream操作总是默默吃掉异常?
前端·人工智能·后端