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}