XiaoRuby
2023-08-07 d8a687741273d121586b83745280c57f7e9d3297
framework/src/main/java/com/yuanchu/limslaboratory/utils/FileSaveUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.yuanchu.limslaboratory.utils;
import com.yuanchu.limslaboratory.exception.MyFileException;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.FileSystemUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * ä¿å­˜æ–‡ä»¶å·¥å…·
 */
@Slf4j
@Component
public class FileSaveUtil {
    // å–yml中的路径 + /
    private static String FILE_PATH;
    private static String[] ALLOWED;
    @Value("${file.path}")
    private String file;
    @Value("${file.allowed}")
    private String[] allowed;
    @PostConstruct
    public void getFile() {
        FILE_PATH = this.file;
    }
    @PostConstruct
    public void getAllowed(){
        ALLOWED = this.allowed;
    }
    /**
     * å­˜å‚¨æ–‡ä»¶ä¸»å‡½æ•°
     * @param file æ–‡ä»¶äºŒè¿›åˆ¶æµ
     * @return è¿”回文件名称用于存储数据库
     */
    public static String StoreFile(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        // ç”Ÿæˆéšæœºåç§°ï¼šæ—¶é—´_随机6位数字
        String FileName = System.currentTimeMillis() + "_" + MyUtil.getNumber(6);
        String suffix = null;
        if (originalFilename != null) {
            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            // å¦‚果后缀名不通过抛出异常
            if (!isFileAllowed(suffix)){
                throw  new MyFileException(suffix);
            }
        }
        // åç§°æ‹¼æŽ¥
        String fileName = FileName + suffix;
        // è¿›è¡Œå­˜å‚¨
        try {
            storeFileWithFileName(file.getBytes(), fileName);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return fileName;
    }
    public static Boolean DeleteFile(String fileName) {
        return FileSystemUtils.deleteRecursively(new File(FILE_PATH + "/" + fileName));
    }
    /**
     * å­˜å‚¨æ–‡ä»¶å‡½æ•°
     * @param content æ–‡ä»¶äºŒè¿›åˆ¶æµ
     * @param fileName æ–‡ä»¶åç§°
     */
    private static void storeFileWithFileName(byte[] content, String fileName) {
        // å­˜å‚¨è·¯å¾„
        String path = FILE_PATH + java.io.File.separatorChar;
        // ç›®å½•不存在则创建
        java.io.File file = new java.io.File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        // å¼€å§‹å­˜å‚¨
        try (FileOutputStream os = new FileOutputStream(path + fileName);
             ByteArrayInputStream is = new ByteArrayInputStream(content)) {
             IOUtils.copy(is, os);
        } catch (IOException e) {
            MyUtil.PrintLog("存储文件异常:" + e);
        }
    }
    /**
     * åˆ¤æ–­æ–‡ä»¶æ˜¯å¦è¢«å…è®¸ä¸Šä¼ 
     *
     * @param fileName æ–‡ä»¶å
     * @return å…è®¸true, å¦åˆ™false
     */
    private static boolean isFileAllowed(String fileName) {
        // èŽ·å–åŽç¼€å
        String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        for (String allow : ALLOWED) {
            if (allow.equals(suffixName)) {
                return true;
            }
        }
        return false;
    }
}