File 与 MultipartFile 相互转换;计算文件夹的最深层数;递归删除某个文件夹;File对象转为InputStream

Posted 可持续化发展

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了File 与 MultipartFile 相互转换;计算文件夹的最深层数;递归删除某个文件夹;File对象转为InputStream相关的知识,希望对你有一定的参考价值。

File --> InputStream

InputStream in = new FileInputStream(file);

 

MultipartFile对象 转换为 File 对象

/**
     * @Author: zcm
     * @DateTime: 2021/10/12 下午3:15
     * @Params: [org.springframework.web.multipart.MultipartFile]
     * @Return java.io.File
     * @Description: 将 MultipartFile对象 转换为 File 对象
     */
    public static File multipartFileToFile(MultipartFile file) throws IOException {
        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(file.getOriginalFilename());
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }
    /**
     * @Author: zcm
     * @DateTime: 2021/10/12 下午3:00
     * @Params: [java.io.InputStream, java.io.File]
     * @Return void
     * @Description: 获取流文件
     */
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 将File对象 转为 MultipartFile

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.io.*;
import java.nio.file.Files;
import java.util.LinkedList;
import java.util.Queue;

/**
     * @Author: zcm
     * @DateTime: 2021/10/12 下午3:01
     * @Params: [java.io.File]
     * @Return org.springframework.web.multipart.MultipartFile
     * @Description: 将File对象 转为 MultipartFile。
     * 转换出来后,注意对比一下,原生的MultipartFile 与 转换出来的 MultipartFile 的
     * 各个属性,因为计算文件幻数的时候,用的是MultipartFile。
     * MultipartFile不止一个实现类,File对象转MultipartFile时,注意看调试时 MultipartFile的实现类
     */
    public static MultipartFile fileToMultipartFile(File file) {
        FileItem fileItem = createFileItem(file);
        MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
        return multipartFile;
    }

    /**
     * @Author: zcm
     * @DateTime: 2021/10/12 下午3:12
     * @Params: [java.io.File]
     * @Return java.lang.String
     * @Description: 获取 MultipartFile 对象的 ContentType属性
     * 就是文件内容的类型
     */
    public static String getContentType(File file) {
        String s = null;
        try {
            s = Files.probeContentType(file.toPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return s;
    }

    /**
     * @Author: zcm
     * @DateTime: 2021/10/12 下午3:14
     * @Params: [java.io.File]
     * @Return org.apache.commons.fileupload.FileItem
     * @Description: 生成 new CommonsMultipartFile(fileItem) 的 FileItem
     */
    private static FileItem createFileItem(File file) {
        FileItemFactory factory = new DiskFileItemFactory(10240, null);
        String contentType = FileUtils.getContentType(file);
        FileItem item = factory.createItem("file", contentType, true, file.getName());
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        try {
            FileInputStream fis = new FileInputStream(file);
            OutputStream os = item.getOutputStream();
            while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return item;
    }

计算文件夹最深层数

/**
     * @Author: zcm
     * @DateTime: 2021/10/11 下午8:09
     * @Params: [java.io.File, int]
     * @Return void
     * @Description: 计算文件夹的最大深度,如果超过 maximumOfFileTreeDepth 层,就抛出异常
     */
    private static int  maximumOfFileTreeDepth = 5;
    public static void checkFileTreeDepth(File file, int depth){
        File[] files = file.listFiles();
        for(int i = 0; i < files.length; i++){
            File f = files[i];
            if (f.isDirectory()){
                depth++;
                if (depth < FileUtils.maximumOfFileTreeDepth){
                    checkFileTreeDepth(f, depth);
                }else{
                    throw new RuntimeException("文件层数太深了!");
                }
                depth--;
            }
        }
        return ;
    }

递归删除某个文件夹

/**
     * @Author: zcm
     * @DateTime: 2021/10/11 下午8:14
     * @Params: [java.lang.String]
     * @Return void
     * @Description: 递归删除这个路径下的所有文件对象
     */
    public static void deleteAllFile(String path){
        File all = new File(path);		//获取其file对象
        File[] fs = all.listFiles();	//遍历path下的文件和目录,放在File数组中
        for(File f:fs){					//遍历File[]数组
            if(!f.isDirectory()){
                f.delete();
            }else {
                deleteAllFile(f.getAbsolutePath());
            }
        }
        all.delete();
    }

以上是关于File 与 MultipartFile 相互转换;计算文件夹的最深层数;递归删除某个文件夹;File对象转为InputStream的主要内容,如果未能解决你的问题,请参考以下文章

File转换成MultiPartFile

spring 将FIle 转换成MultipartFile

spring 将FIle 转换成MultipartFile

File转换成MultipartFile

怎么把 File 类型转 MultipartFile

如何将MultipartFile转换成based4