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

使用背景

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

用户上传文件

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;
    }
}
相关推荐
小许学java2 小时前
Spring事务和事务传播机制
java·数据库·spring·事务
大学生资源网2 小时前
基于Javaweb技术的宠物用品商城的设计与实现(源码+文档)
java·mysql·毕业设计·源码·springboot
汤姆yu2 小时前
基于springboot的热门文创内容推荐分享系统
java·spring boot·后端
星光一影2 小时前
教育培训机构消课管理系统智慧校园艺术舞蹈美术艺术培训班扣课时教务管理系统
java·spring boot·mysql·vue·mybatis·uniapp
lkbhua莱克瓦242 小时前
MySQL介绍
java·开发语言·数据库·笔记·mysql
武昌库里写JAVA2 小时前
在iview中使用upload组件上传文件之前先做其他的处理
java·vue.js·spring boot·后端·sql
董世昌412 小时前
什么是事件冒泡?如何阻止事件冒泡和浏览器默认事件?
java·前端
好度2 小时前
配置java标准环境?(详细教程)
java·开发语言
嘻哈baby2 小时前
AI让我变强了还是变弱了?一个后端开发的年终自省
后端