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

使用背景

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

用户上传文件

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;
    }
}
相关推荐
captain3763 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
Novproxy_Z4 小时前
商用代理避坑:如何识别商家拿机房 IP 冒充住宅 IP
java·网络·tcp/ip
文丑颜不良啊5 小时前
LeetCode1481~1500题目解析
java·leetcode
2601_962885725 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
深蓝AI5 小时前
Python 3.13 的 Queue.shutdown:异步消费者终于能正常收工了
后端
前端精髓5 小时前
调用openrouter的免费API模型
java·前端·javascript
武子康5 小时前
MultiNet6 空闲崩溃:`EXCVADDR=0x8` 后又出现 `CORRUPT HEAP`
人工智能·后端·agent
步行cgn5 小时前
Spring MVC 拦截器 Interceptor 详解:从执行流程到实战应用
java·spring·mvc
文丑颜不良啊5 小时前
LeetCode1381~1400题目解析
java·leetcode
开开心心_Every6 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea