package com.ruoyi.common.utils.file; 
 | 
  
 | 
import java.io.File; 
 | 
import java.io.FileInputStream; 
 | 
import java.io.FileNotFoundException; 
 | 
import java.io.FileOutputStream; 
 | 
import java.io.IOException; 
 | 
import java.io.OutputStream; 
 | 
import java.io.UnsupportedEncodingException; 
 | 
import java.net.URLEncoder; 
 | 
import java.nio.charset.StandardCharsets; 
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import javax.servlet.http.HttpServletResponse; 
 | 
  
 | 
import org.apache.commons.io.IOUtils; 
 | 
import org.apache.commons.lang3.ArrayUtils; 
 | 
import com.ruoyi.common.config.RuoYiConfig; 
 | 
import com.ruoyi.common.utils.DateUtils; 
 | 
import com.ruoyi.common.utils.StringUtils; 
 | 
import com.ruoyi.common.utils.uuid.IdUtils; 
 | 
import org.apache.commons.io.FilenameUtils; 
 | 
  
 | 
/** 
 | 
 * 文件处理工具类 
 | 
 * 
 | 
 * @author ruoyi 
 | 
 */ 
 | 
public class FileUtils { 
 | 
    public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; 
 | 
  
 | 
    /** 
 | 
     * 输出指定文件的byte数组 
 | 
     * 
 | 
     * @param filePath 文件路径 
 | 
     * @param os       输出流 
 | 
     * @return 
 | 
     */ 
 | 
    public static void writeBytes(String filePath, OutputStream os) throws IOException { 
 | 
        FileInputStream fis = null; 
 | 
        try { 
 | 
            File file = new File(filePath); 
 | 
            if (!file.exists()) { 
 | 
                throw new FileNotFoundException(filePath); 
 | 
            } 
 | 
            fis = new FileInputStream(file); 
 | 
            byte[] b = new byte[1024]; 
 | 
            int length; 
 | 
            while ((length = fis.read(b)) > 0) { 
 | 
                os.write(b, 0, length); 
 | 
            } 
 | 
        } catch (IOException e) { 
 | 
            throw e; 
 | 
        } finally { 
 | 
            IOUtils.close(os); 
 | 
            IOUtils.close(fis); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 写数据到文件中 
 | 
     * 
 | 
     * @param data 数据 
 | 
     * @return 目标文件 
 | 
     * @throws IOException IO异常 
 | 
     */ 
 | 
    public static String writeImportBytes(byte[] data) throws IOException { 
 | 
        return writeBytes(data, RuoYiConfig.getImportPath()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 写数据到文件中 
 | 
     * 
 | 
     * @param data      数据 
 | 
     * @param uploadDir 目标文件 
 | 
     * @return 目标文件 
 | 
     * @throws IOException IO异常 
 | 
     */ 
 | 
    public static String writeBytes(byte[] data, String uploadDir) throws IOException { 
 | 
        FileOutputStream fos = null; 
 | 
        String pathName = ""; 
 | 
        try { 
 | 
            String extension = getFileExtendName(data); 
 | 
            pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; 
 | 
            File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); 
 | 
            fos = new FileOutputStream(file); 
 | 
            fos.write(data); 
 | 
        } finally { 
 | 
            IOUtils.close(fos); 
 | 
        } 
 | 
        return FileUploadUtils.getPathFileName(uploadDir, pathName); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除文件 
 | 
     * 
 | 
     * @param filePath 文件 
 | 
     * @return 
 | 
     */ 
 | 
    public static boolean deleteFile(String filePath) { 
 | 
        boolean flag = false; 
 | 
        File file = new File(filePath); 
 | 
        // 路径为文件且不为空则进行删除 
 | 
        if (file.isFile() && file.exists()) { 
 | 
            flag = file.delete(); 
 | 
        } 
 | 
        return flag; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 文件名称验证 
 | 
     * 
 | 
     * @param filename 文件名称 
 | 
     * @return true 正常 false 非法 
 | 
     */ 
 | 
    public static boolean isValidFilename(String filename) { 
 | 
        return filename.matches(FILENAME_PATTERN); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 检查文件是否可下载 
 | 
     * 
 | 
     * @param resource 需要下载的文件 
 | 
     * @return true 正常 false 非法 
 | 
     */ 
 | 
    public static boolean checkAllowDownload(String resource) { 
 | 
        // 禁止目录上跳级别 
 | 
        if (StringUtils.contains(resource, "..")) { 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        // 检查允许下载的文件规则 
 | 
        if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) { 
 | 
            return true; 
 | 
        } 
 | 
  
 | 
        // 不在允许下载的文件规则 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 下载文件名重新编码 
 | 
     * 
 | 
     * @param request  请求对象 
 | 
     * @param fileName 文件名 
 | 
     * @return 编码后的文件名 
 | 
     */ 
 | 
    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException { 
 | 
        final String agent = request.getHeader("USER-AGENT"); 
 | 
        String filename = fileName; 
 | 
        if (agent.contains("MSIE")) { 
 | 
            // IE浏览器 
 | 
            filename = URLEncoder.encode(filename, "utf-8"); 
 | 
            filename = filename.replace("+", " "); 
 | 
        } else if (agent.contains("Firefox")) { 
 | 
            // 火狐浏览器 
 | 
            filename = new String(fileName.getBytes(), "ISO8859-1"); 
 | 
        } else if (agent.contains("Chrome")) { 
 | 
            // google浏览器 
 | 
            filename = URLEncoder.encode(filename, "utf-8"); 
 | 
        } else { 
 | 
            // 其它浏览器 
 | 
            filename = URLEncoder.encode(filename, "utf-8"); 
 | 
        } 
 | 
        return filename; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 下载文件名重新编码 
 | 
     * 
 | 
     * @param response     响应对象 
 | 
     * @param realFileName 真实文件名 
 | 
     */ 
 | 
    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException { 
 | 
        String percentEncodedFileName = percentEncode(realFileName); 
 | 
  
 | 
        StringBuilder contentDispositionValue = new StringBuilder(); 
 | 
        contentDispositionValue.append("attachment; filename=").append(percentEncodedFileName).append(";").append("filename*=").append("utf-8''").append(percentEncodedFileName); 
 | 
  
 | 
        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); 
 | 
        response.setHeader("Content-disposition", contentDispositionValue.toString()); 
 | 
        response.setHeader("download-filename", percentEncodedFileName); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 百分号编码工具方法 
 | 
     * 
 | 
     * @param s 需要百分号编码的字符串 
 | 
     * @return 百分号编码后的字符串 
 | 
     */ 
 | 
    public static String percentEncode(String s) throws UnsupportedEncodingException { 
 | 
        String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); 
 | 
        return encode.replaceAll("\\+", "%20"); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取图像后缀 
 | 
     * 
 | 
     * @param photoByte 图像数据 
 | 
     * @return 后缀名 
 | 
     */ 
 | 
    public static String getFileExtendName(byte[] photoByte) { 
 | 
        String strFileExtendName = "jpg"; 
 | 
        if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) { 
 | 
            strFileExtendName = "gif"; 
 | 
        } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) { 
 | 
            strFileExtendName = "jpg"; 
 | 
        } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) { 
 | 
            strFileExtendName = "bmp"; 
 | 
        } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) { 
 | 
            strFileExtendName = "png"; 
 | 
        } 
 | 
        return strFileExtendName; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png 
 | 
     * 
 | 
     * @param fileName 路径名称 
 | 
     * @return 没有文件路径的名称 
 | 
     */ 
 | 
    public static String getName(String fileName) { 
 | 
        if (fileName == null) { 
 | 
            return null; 
 | 
        } 
 | 
        int lastUnixPos = fileName.lastIndexOf('/'); 
 | 
        int lastWindowsPos = fileName.lastIndexOf('\\'); 
 | 
        int index = Math.max(lastUnixPos, lastWindowsPos); 
 | 
        return fileName.substring(index + 1); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi 
 | 
     * 
 | 
     * @param fileName 路径名称 
 | 
     * @return 没有文件路径和后缀的名称 
 | 
     */ 
 | 
    public static String getNameNotSuffix(String fileName) { 
 | 
        if (fileName == null) { 
 | 
            return null; 
 | 
        } 
 | 
        String baseName = FilenameUtils.getBaseName(fileName); 
 | 
        return baseName; 
 | 
    } 
 | 
  
 | 
    public static void createFile(String path) { 
 | 
        File file = new File(path); 
 | 
        if (!file.exists()) { 
 | 
            file.mkdirs(); 
 | 
        } 
 | 
    } 
 | 
} 
 |