All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kaizen4j.common.util.FileUtils Maven / Gradle / Ivy

package org.kaizen4j.common.util;

import com.google.common.base.Throwables;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import java.io.*;
import java.util.*;

import static java.util.Objects.nonNull;
import static org.kaizen4j.common.base.Symbols.*;

/**
 * 文件工具类
 *
 * @author John
 */
public final class FileUtils {

    private static final int randomRange = 999;

    /**
     * 创建一个新的文件,该文件包含的文件目录也会被同时创建
     *
     * @param fullname 包含文件路径的文件名称
     * @return 成功创建地文件
     *
     * @throws IOException
     */
    public static File createFile(String fullname) {
        File file = new File(fullname);
        try {
            createPath(file.getParent());
            if (!file.exists()) {
                file.createNewFile();
            }
            return file;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 创建文件目录
     *
     * @param path 文件目录
     */
    public static void createPath(String path) {
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
    }

    /**
     * 文件写入
     *
     * @param file 文件对象
     * @param bytes 写入字节数组
     *
     * @throws IOException
     */
    public static void writeFile(File file, byte[] bytes) {
        OutputStream writer = null;
        try {
            writer = new BufferedOutputStream(new FileOutputStream(file));
            writer.write(bytes);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (nonNull(writer)) {
                    writer.flush();
                    writer.close();
                }
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }
    }

    /**
     * 解析 MultipartHttpServletRequest 对象中的文件列表
     *
     * @param multipartRequest
     * @return 返回 MultipartFile 对象集合
     */
    public static List getMultipartFiles(
            MultipartHttpServletRequest multipartRequest) {
        List files = new ArrayList<>();
        Optional.ofNullable(multipartRequest).map(MultipartHttpServletRequest::getFileNames)
                .ifPresent(iterator -> iterator
                        .forEachRemaining(name -> files.add(multipartRequest.getFile(name))));
        return files;
    }

    /**
     * 上传文件
     *
     * @param files List
     * @param savePath 文件保存的绝对路径
     * @param folderName 文件保存的文件夹名称
     * @return 以文件名为 key,文件的相对路径为 value 的 Map
     *
     * @throws IOException
     */
    public static Map uploadFileToMap(List files, String savePath,
            String folderName) {
        Map map = new HashMap<>();

        for (MultipartFile file : files) {
            if (file.isEmpty()) {
                continue;
            }
            // 重命名文件名
            String originalFilename = file.getOriginalFilename();
            String filename = randomName(originalFilename);

            // 创建文件路径
            String fileAbsolutePath = createPath(savePath, folderName);
            String fileRelativePath = createPath(EMPTY, folderName) + filename;

            // 创建文件
            File saveFolder = new File(fileAbsolutePath);
            if (!saveFolder.exists()) {
                saveFolder.mkdirs();
            }

            File saveFile = new File(fileAbsolutePath + filename);
            try {
                writeFile(saveFile, file.getBytes());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            map.put(originalFilename, fileRelativePath.replaceAll("\\\\", SLASH));
        }

        return map;
    }

    /**
     * 上传文件
     *
     * @param files List
     * @param savePath 文件保存的绝对路径
     * @param folderName 文件保存的文件夹名称
     * @return 文件的相对路径的 List
     *
     * @throws IOException
     */
    public static List uploadFileToList(List files, String savePath,
            String folderName) {
        List list = new ArrayList<>();

        for (MultipartFile file : files) {
            if (file.isEmpty()) {
                continue;
            }
            // 重命名文件名
            String originalFilename = file.getOriginalFilename();
            String filename = randomName(originalFilename);

            // 创建文件路径
            String fileAbsolutePath = createPath(savePath, folderName);
            String fileRelativePath = createPath(EMPTY, folderName) + filename;

            // 创建文件
            File saveFolder = new File(fileAbsolutePath);
            if (!saveFolder.exists()) {
                saveFolder.mkdirs();
            }

            File saveFile = new File(fileAbsolutePath + filename);
            try {
                writeFile(saveFile, file.getBytes());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            list.add(fileRelativePath.replaceAll("\\\\", SLASH));
        }

        return list;
    }

    /**
     * 生成文件夹路径(文件保存的绝对路径+文件夹名称+当前日期)
     *
     * @param savePath 文件保存的绝对路径
     * @param folderName 文件夹名称
     * @return 生成的路径
     */
    public static String createPath(String savePath, String folderName) {
        StringBuffer path = new StringBuffer();
        path.append(savePath);
        path.append(File.separator);
        path.append(folderName);
        path.append(File.separator);
        path.append(DateUtils.currentDateString("yyyyMMdd"));
        path.append(File.separator);

        return path.toString();
    }

    /**
     * 生成随机文件名(当前时间毫秒+[0-999]随机数+原始文件名称后缀)
     *
     * @param originalFilename 原始文件名称
     * @return 生成的文件名
     */
    public static String randomName(String originalFilename) {
        StringBuffer name = new StringBuffer();
        name.append(System.currentTimeMillis());
        name.append(new Random().nextInt(randomRange));
        name.append(originalFilename.substring(originalFilename.lastIndexOf(DOT)));

        return name.toString();
    }

    /**
     * 获取文件目录及其子目录下的所有文件
     *
     * @param folder 文件目录
     * @return 所有文件列表
     */
    public static List allFiles(final File folder) {
        List filesList = new ArrayList();
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                filesList.addAll(allFiles(fileEntry));
            } else {
                filesList.add(fileEntry);
            }
        }
        return filesList;
    }

    /**
     * 获取文件目录及其子目录下的符合扩展名过滤的所有文件
     *
     * @param folder 文件目录
     * @param extensions 文件扩展名数组
     * @return 所有过滤后的文件列表
     */
    public static List allFiles(final File folder, String... extensions) {
        List filesList = new ArrayList();
        List allFiles = allFiles(folder);

        for (File file : allFiles) {
            // 文件扩展名过滤
            for (String extension : extensions) {
                if (file.getName().toLowerCase().endsWith(extension.toLowerCase().trim())) {
                    filesList.add(file);
                    break;
                }
            }
        }
        return filesList;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy