001package top.cenze.utils.file;
002
003import cn.hutool.core.io.FileUtil;
004import cn.hutool.core.util.ObjectUtil;
005import lombok.SneakyThrows;
006import lombok.extern.slf4j.Slf4j;
007import org.apache.commons.fileupload.FileItem;
008import org.apache.commons.fileupload.FileItemFactory;
009import org.apache.commons.fileupload.disk.DiskFileItemFactory;
010import org.springframework.util.DigestUtils;
011import org.springframework.web.multipart.MultipartFile;
012import org.springframework.web.multipart.commons.CommonsMultipartFile;
013
014import java.io.File;
015import java.io.FileInputStream;
016import java.io.IOException;
017import java.io.OutputStream;
018
019/**
020 * ------------------------------------------------------------
021 *
022 * @Author: chengze
023 * @Date: 2021/12/7 18:12
024 * @Description: 本地文件转MultipartFile
025 * ------------------------------------------------------------
026 * 参考文档:https://blog.csdn.net/weixin_43552143/article/details/124212660
027 */
028@Slf4j
029public class MultipartFileUtil {
030
031    // 根据文件绝对路径创建FileItem
032    public static FileItem getFileItem(String filePath) {
033        File file = new File(filePath);
034
035        return getFileItem(file);
036    }
037
038    // 根据文件对象创建FileItem
039    public static FileItem getFileItem(File file) {
040        log.info("getFileItem file name: {}", file.getName());
041        if (ObjectUtil.isNull(file) && !FileUtil.exist(file)) {
042            return null;
043        }
044
045        FileItemFactory factory = new DiskFileItemFactory(16, null);
046        FileItem item = factory.createItem("textField", "text/plain", true, file.getName());
047        int bytesRead = 0;
048        byte[] buffer = new byte[8192];
049        try {
050            FileInputStream fis = new FileInputStream(file);
051            OutputStream os = item.getOutputStream();
052            while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
053                os.write(buffer, 0, bytesRead);
054            }
055
056            os.flush();
057            os.close();
058            fis.close();
059        } catch (IOException e) {
060            e.printStackTrace();
061        }
062
063        return item;
064    }
065
066    // 根据文件绝对路径创建MultipartFile
067    public static MultipartFile getMultipartFile(String filePath) {
068        FileItem fileItem = getFileItem(filePath);
069        if (ObjectUtil.isNull(fileItem)) {
070            return null;
071        }
072
073        return new CommonsMultipartFile(fileItem);
074    }
075
076    // 根据文件对象创建MultipartFile
077    public static MultipartFile getMultipartFile(File file) {
078        log.info("getMultipartFile file name: {}", file.getName());
079        FileItem fileItem = getFileItem(file);
080        if (ObjectUtil.isNull(fileItem)) {
081            return null;
082        }
083
084        return new CommonsMultipartFile(fileItem);
085    }
086
087    public static MultipartFile getMultipartFile(FileItem fileItem) {
088        if (ObjectUtil.isNull(fileItem)) {
089            return null;
090        }
091
092        return new CommonsMultipartFile(fileItem);
093    }
094
095    /**
096     * 获取文件md5码,做为文件的唯一识别码
097     * @param file
098     * @return
099     */
100    @SneakyThrows
101    public static String getMd5(MultipartFile file) {
102        if (ObjectUtil.isNull(file)) {
103            return null;
104        }
105
106        return DigestUtils.md5DigestAsHex(file.getInputStream());
107    }
108}