ruoyi的spring cloud项目详解(八)

ruoyi的spring cloud项目详解(七)-CSDN博客

今天学习工具类吧,虽然再实际应用中一般都是CV,但是了解一下内部结构

com/ruoyi/common/utils/bean/BeanUtils.java

package com.ruoyi.common.utils.bean;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Bean 工具类
 * 
 * @author ruoyi
 */
public class BeanUtils extends org.springframework.beans.BeanUtils
{
    /** Bean方法名中属性名开始的下标 */
    private static final int BEAN_METHOD_PROP_INDEX = 3;

    /** * 匹配getter方法的正则表达式 */
    private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)");

    /** * 匹配setter方法的正则表达式 */
    private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");

    /**
     * Bean属性复制工具方法。
     * 
     * @param dest 目标对象
     * @param src 源对象
     */
    public static void copyBeanProp(Object dest, Object src)
    {
        try
        {
            copyProperties(src, dest);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 获取对象的setter方法。
     * 
     * @param obj 对象
     * @return 对象的setter方法列表
     */
    public static List<Method> getSetterMethods(Object obj)
    {
        // setter方法列表
        List<Method> setterMethods = new ArrayList<Method>();

        // 获取所有方法
        Method[] methods = obj.getClass().getMethods();

        // 查找setter方法

        for (Method method : methods)
        {
            Matcher m = SET_PATTERN.matcher(method.getName());
            if (m.matches() && (method.getParameterTypes().length == 1))
            {
                setterMethods.add(method);
            }
        }
        // 返回setter方法列表
        return setterMethods;
    }

    /**
     * 获取对象的getter方法。
     * 
     * @param obj 对象
     * @return 对象的getter方法列表
     */

    public static List<Method> getGetterMethods(Object obj)
    {
        // getter方法列表
        List<Method> getterMethods = new ArrayList<Method>();
        // 获取所有方法
        Method[] methods = obj.getClass().getMethods();
        // 查找getter方法
        for (Method method : methods)
        {
            Matcher m = GET_PATTERN.matcher(method.getName());
            if (m.matches() && (method.getParameterTypes().length == 0))
            {
                getterMethods.add(method);
            }
        }
        // 返回getter方法列表
        return getterMethods;
    }

    /**
     * 检查Bean方法名中的属性名是否相等。<br>
     * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。
     * 
     * @param m1 方法名1
     * @param m2 方法名2
     * @return 属性名一样返回true,否则返回false
     */

    public static boolean isMethodPropEquals(String m1, String m2)
    {
        return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));
    }
}

package com.ruoyi.common.utils.bean;
  • 这行代码指定了该类所在的包名,有助于组织和管理代码。

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
  • 这些导入语句引入了在该类中使用的 Java 类和接口。包括用于反射获取方法的Method类、用于存储方法列表的ArrayListList接口,以及用于正则表达式匹配的MatcherPattern类。

public class BeanUtils extends org.springframework.beans.BeanUtils

定义了一个名为BeanUtils的公共类,并继承自org.springframework.beans.BeanUtils。这使得该类可以访问父类中的方法,同时也可以添加自己的特定方法。

/** Bean方法名中属性名开始的下标 */
private static final int BEAN_METHOD_PROP_INDEX = 3;

定义了一个私有静态常量BEAN_METHOD_PROP_INDEX,其值为 3。这个常量可能用于在方法名中确定属性名的开始位置。

/** * 匹配getter方法的正则表达式 */
private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)");

创建了一个私有静态常量GET_PATTERN,它是一个正则表达式模式,用于匹配 Java Bean 的 getter 方法。正则表达式"get(\\p{javaUpperCase}\\w*)"表示以 "get" 开头,后面跟着一个大写字母开头的单词。

/** * 匹配setter方法的正则表达式 */
private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");

类似于上面的GET_PATTERN,这个常量是用于匹配 Java Bean 的 setter 方法的正则表达式模式。它以 "set" 开头,后面跟着一个大写字母开头的单词。

public static void copyBeanProp(Object dest, Object src)

定义了一个公共静态方法copyBeanProp,它接受两个对象参数dest(目标对象)和src(源对象)。这个方法的目的可能是将源对象的属性复制到目标对象。

try
{
    copyProperties(src, dest);
}
catch (Exception e)
{
    e.printStackTrace();
}

copyBeanProp方法中,使用了try-catch块来处理可能出现的异常。它调用了父类org.springframework.beans.BeanUtils中的copyProperties方法来进行属性复制。如果出现异常,会打印异常的堆栈跟踪信息。

public static List<Method> getSetterMethods(Object obj)

定义了一个公共静态方法getSetterMethods,它接受一个对象参数obj,并返回一个包含该对象的 setter 方法的列表。

// setter方法列表
List<Method> setterMethods = new ArrayList<Method>();

创建了一个List类型的变量setterMethods,用于存储对象的 setter 方法。初始化为一个空的ArrayList

// 获取所有方法
Method[] methods = obj.getClass().getMethods();

通过调用对象的getClass()方法获取对象的类,然后调用getMethods()方法获取该类的所有公共方法,并将结果存储在Method数组methods中。

// 查找setter方法
for (Method method : methods)
{
    Matcher m = SET_PATTERN.matcher(method.getName());
    if (m.matches() && (method.getParameterTypes().length == 1))
    {
        setterMethods.add(method);
    }
}

使用一个for-each循环遍历methods数组中的每个方法。对于每个方法,使用SET_PATTERN正则表达式进行匹配,并检查方法的参数个数是否为 1。如果匹配成功且参数个数符合要求,将该方法添加到setterMethods列表中。

// 返回setter方法列表
return setterMethods;

返回包含对象 setter 方法的列表。

public static List<Method> getGetterMethods(Object obj)

类似于getSetterMethods方法,这个方法定义了一个公共静态方法getGetterMethods,用于获取对象的 getter 方法列表。

// getter方法列表
List<Method> getterMethods = new ArrayList<Method>();

创建一个用于存储 getter 方法的列表。

// 获取所有方法
Method[] methods = obj.getClass().getMethods();

同样获取对象的所有公共方法。

// 查找getter方法
for (Method method : methods)
{
    Matcher m = GET_PATTERN.matcher(method.getName());
    if (m.matches() && (method.getParameterTypes().length == 0))
    {
        getterMethods.add(method);
    }
}

遍历方法列表,使用GET_PATTERN正则表达式进行匹配,并检查方法是否无参数。如果匹配成功且参数个数符合要求,将该方法添加到getterMethods列表中。

// 返回getter方法列表
return getterMethods;

返回包含对象 getter 方法的列表。

public static boolean isMethodPropEquals(String m1, String m2)

定义了一个公共静态方法isMethodPropEquals,用于检查两个方法名中的属性名是否相等。

return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));

通过截取两个方法名从BEAN_METHOD_PROP_INDEX(常量值为 3)开始的部分进行比较,如果相等则返回true,否则返回false

这段 Java 代码主要提供了一些与 Java Bean 操作相关的工具方法,具体功能如下:

  1. 属性复制

    • copyBeanProp(Object dest, Object src)方法用于将源对象src的属性复制到目标对象dest。它利用了org.springframework.beans.BeanUtils.copyProperties方法来实现属性复制,在出现异常时仅打印堆栈跟踪信息。
  2. 获取 setter 方法列表

    • getSetterMethods(Object obj)方法接收一个对象,通过遍历对象类的所有方法,并使用正则表达式匹配以 “set” 开头且参数个数为 1 的方法,最终返回包含该对象所有 setter 方法的列表。
  3. 获取 getter 方法列表

    • getGetterMethods(Object obj)方法与获取 setter 方法类似,它遍历对象类的所有方法,使用正则表达式匹配以 “get” 开头且无参数的方法,返回对象的所有 getter 方法列表。
  4. 检查方法属性名是否相等

    • isMethodPropEquals(String m1, String m2)方法用于检查两个方法名中的属性名是否相等。它通过截取方法名从特定下标(常量BEAN_METHOD_PROP_INDEX值为 3)开始的部分进行比较,相等则返回true,否则返回false

总的来说,这个工具类可以方便地在 Java 应用中进行 Java Bean 的属性复制以及获取和操作对象的 setter 和 getter 方法,有助于实现一些与对象属性操作相关的功能。但在实际使用中可能需要注意性能和异常处理等方面的问题,可以根据具体需求进行适当的优化和改进。

咱们接着看

com/ruoyi/common/utils/file/FileUploadUtils.java

package com.ruoyi.common.utils.file;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;

import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException;
import com.ruoyi.common.exception.file.FileSizeLimitExceededException;
import com.ruoyi.common.exception.file.InvalidExtensionException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.security.Md5Utils;

/**
 * 文件上传工具类
 * 
 * @author ruoyi
 */
public class FileUploadUtils
{
    /**
     * 默认大小 50M
     */
    public static final long DEFAULT_MAX_SIZE         = 50 * 1024 * 1024;

    /**
     * 默认的文件名最大长度 100
     */
    public static final int  DEFAULT_FILE_NAME_LENGTH = 100;

    private static int       counter                  = 0;

    /**
     * 根据文件路径上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @return 文件名称
     * @throws IOException
     */
    public static final String upload(String baseDir, MultipartFile file) throws IOException
    {
        try
        {
            return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        }
        catch (Exception e)
        {
            throw new IOException(e.getMessage(), e);
        }
    }

    /**
     * 文件上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @param extension 上传文件类型
     * @return 返回上传成功的文件名
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws FileNameLengthLimitExceededException 文件名太长
     * @throws IOException 比如读写文件出错时
     * @throws InvalidExtensionException 文件校验异常
     */
    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException
    {
        int fileNamelength = file.getOriginalFilename().length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
        {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }
        assertAllowed(file, allowedExtension);
        String fileName = extractFilename(file);
        File desc = getAbsoluteFile(baseDir, fileName);
        file.transferTo(desc);
        String pathFileName = getPathFileName(baseDir, fileName);
        return pathFileName;
    }

    /**
     * 编码文件名
     */
    public static final String extractFilename(MultipartFile file)
    {
        String fileName = file.getOriginalFilename();
        String extension = getExtension(file);
        fileName = DateUtils.datePath() + "/" + encodingFilename(fileName) + "." + extension;
        return fileName;
    }

    private static final String getPathFileName(String uploadDir, String fileName) throws IOException
    {
        int dirLastIndex = uploadDir.lastIndexOf("/") + 1;
        String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
        String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
        return pathFileName;
    }

    private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
    {
        File desc = new File(uploadDir + File.separator + fileName);
        // 高版本spring中CommonsMultipartFile会自动创建desc,如果创建会报错
        // if (!desc.getParentFile().exists())
        // {
        // desc.getParentFile().mkdirs();
        // }
        // if (!desc.exists())
        // {
        // desc.createNewFile();
        // }
        return desc;
    }

    /**
     * 编码文件名
     */
    private static final String encodingFilename(String fileName)
    {
        fileName = fileName.replace("_", " ");
        fileName = Md5Utils.hash(fileName + System.nanoTime() + counter++);
        return fileName;
    }

    /**
     * 文件大小校验
     *
     * @param file 上传的文件
     * @return
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws InvalidExtensionException
     */
    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, InvalidExtensionException
    {
        long size = file.getSize();
        if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
        {
            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
        }
        String fileName = file.getOriginalFilename();
        String extension = getExtension(file);
        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
        {
            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
                        fileName);
            }
            else
            {
                throw new InvalidExtensionException(allowedExtension, extension, fileName);
            }
        }
    }

    /**
     * 判断MIME类型是否是允许的MIME类型
     *
     * @param extension
     * @param allowedExtension
     * @return
     */
    public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
    {
        for (String str : allowedExtension)
        {
            if (str.equalsIgnoreCase(extension))
            {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取文件名的后缀
     * 
     * @param file 表单文件
     * @return 后缀名
     */
    public static final String getExtension(MultipartFile file)
    {
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        if (StringUtils.isEmpty(extension))
        {
            extension = MimeTypeUtils.getExtension(file.getContentType());
        }
        return extension;
    }
}

 

以下是对这段 Java 代码的分析:

**一、功能概述**

这个类是一个文件上传工具类,主要用于处理文件上传的相关操作,包括文件名编码、文件大小校验、文件类型校验以及确定文件的存储路径等。

**二、方法分析**

1. `upload(String baseDir, MultipartFile file)`:
   - 这个方法是一个简化的文件上传方法,内部调用了另一个重载的`upload`方法,并使用默认的允许文件扩展名进行文件上传。如果出现异常,会将异常包装后重新抛出。
2. `upload(String baseDir, MultipartFile file, String[] allowedExtension)`:
   - 主要的文件上传方法。首先检查文件名长度是否超过默认的最大长度,如果超过则抛出`FileNameLengthLimitExceededException`异常。然后调用`assertAllowed`方法进行文件大小和类型的校验。接着提取文件名并确定文件的存储路径,最后将上传的文件保存到指定位置。如果在过程中出现异常,会根据不同的异常类型进行抛出。
3. `extractFilename(MultipartFile file)`:
   - 提取文件名的方法。从上传的文件中获取原始文件名,提取文件扩展名,然后使用当前日期作为路径的一部分,结合编码后的文件名和扩展名生成新的文件名。
4. `getPathFileName(String uploadDir, String fileName)`:
   - 根据上传目录和文件名生成文件的绝对路径名,用于在应用中访问上传的文件。
5. `getAbsoluteFile(String uploadDir, String fileName)`:
   - 根据上传目录和文件名创建一个`File`对象,表示文件的存储位置。在高版本的 Spring 中,`CommonsMultipartFile`可能会自动创建这个文件,这里注释掉了一些手动创建文件和目录的代码。
6. `encodingFilename(String fileName)`:
   - 对文件名进行编码。首先将文件名中的下划线替换为空格,然后结合系统时间和一个计数器生成一个唯一的字符串,并使用 MD5 进行哈希,作为编码后的文件名。
7. `assertAllowed(MultipartFile file, String[] allowedExtension)`:
   - 进行文件大小和类型的校验。检查文件大小是否超过默认的最大大小,如果超过则抛出`FileSizeLimitExceededException`异常。然后获取文件的扩展名,检查是否在允许的扩展名列表中,如果不在则根据不同的文件类型抛出相应的`InvalidExtensionException`异常。
8. `isAllowedExtension(String extension, String[] allowedExtension)`:
   - 判断文件扩展名是否在允许的扩展名列表中。遍历允许的扩展名列表,检查是否有与上传文件扩展名相同的项,如果有则返回`true`,否则返回`false`。
9. `getExtension(MultipartFile file)`:
   - 获取上传文件的扩展名。首先尝试从文件名中提取扩展名,如果文件名中没有扩展名,则根据文件的`Content-Type`获取扩展名。

**三、用途和优势**

这个工具类可以方便地在 Java 应用中进行文件上传操作,提供了对文件名长度、文件大小和文件类型的校验,确保上传的文件符合应用的要求。同时,通过编码文件名和使用日期作为路径的一部分,可以提高文件存储的安全性和组织性。

com/ruoyi/common/utils/file/FileUtils.java

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 javax.servlet.http.HttpServletRequest;

/**
 * 文件处理工具类
 * 
 * @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
        {
            if (os != null)
            {
                try
                {
                    os.close();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
            }
            if (fis != null)
            {
                try
                {
                    fis.close();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
            }
        }
    }

    /**
     * 删除文件
     * 
     * @param filePath 文件
     * @return
     */
    public static boolean deleteFile(String filePath)
    {
        boolean flag = false;
        File file = new File(filePath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists())
        {
            file.delete();
            flag = true;
        }
        return flag;
    }

    /**
     * 文件名称验证
     * 
     * @param filename 文件名称
     * @return true 正常 false 非法
     */
    public static boolean isValidFilename(String filename)
    {
        return filename.matches(FILENAME_PATTERN);
    }

    /**
     * 下载文件名重新编码
     * 
     * @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;
    }
    
    /**
     * 获取系统临时目录
     * @return
     */
    public static String getTemp()
    {
        return System.getProperty("java.io.tmpdir");
    }

    /**
     * 创建临时文件
     * @param filePath
     * @param data
     * @return
     */
    public static File createTempFile(String filePath, byte[] data) throws IOException
    {
        String temp = getTemp() + filePath;
        File file = new File(temp);
        if (!file.getParentFile().exists())
        {
            file.getParentFile().mkdirs();
        }
        if (!file.exists())
        {
            file.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(data, 0, data.length);
        fos.flush();
        fos.close();
        return file;
    }
}

以下是对这段 Java 代码的分析:

**一、功能概述**

这个类是一个文件处理工具类,提供了一系列与文件操作相关的方法,包括输出文件字节数组、删除文件、验证文件名合法性、设置文件下载头部信息、获取系统临时目录以及创建临时文件等功能。

**二、方法分析**

1. `writeBytes(String filePath, OutputStream os)`:
   - 该方法用于将指定文件路径的文件内容以字节数组的形式写入到输出流中。它首先创建一个`FileInputStream`来读取文件,然后循环读取文件的字节并写入到输出流中。在读取和写入过程中,如果出现`IOException`异常,会重新抛出。最后,确保输入流和输出流都被正确关闭,以防止资源泄漏。
2. `deleteFile(String filePath)`:
   - 这个方法用于删除指定路径的文件。它首先创建一个`File`对象,检查文件是否存在且为普通文件,如果满足条件则调用`delete()`方法删除文件,并返回`true`表示删除成功,否则返回`false`。
3. `isValidFilename(String filename)`:
   - 用于验证文件名是否合法。它使用正则表达式`FILENAME_PATTERN`(只允许字母、数字、下划线、连字符、竖线、点和中文字符)来匹配文件名,如果文件名符合正则表达式,则返回`true`,否则返回`false`。
4. `setFileDownloadHeader(HttpServletRequest request, String fileName)`:
   - 这个方法用于设置文件下载的头部信息,以便在浏览器中正确显示下载文件名。它根据请求的用户代理(`USER-AGENT`)判断浏览器类型,对文件名进行不同的编码处理,以适应不同浏览器的下载需求。
5. `getTemp()`:
   - 简单地获取系统的临时目录路径,通过调用`System.getProperty("java.io.tmpdir")`实现。
6. `createTempFile(String filePath, byte[] data)`:
   - 用于创建临时文件。它首先根据系统临时目录和传入的文件路径构建临时文件的完整路径,然后检查临时文件的父目录是否存在,如果不存在则创建。接着,如果临时文件不存在则创建新文件,并使用`FileOutputStream`将传入的字节数组写入到临时文件中,最后返回创建的临时文件对象。

**三、用途和优势**

这个工具类可以在 Java 应用中方便地进行文件的读写、删除、验证以及处理文件下载等操作,提高了文件处理的效率和便利性。同时,通过对不同浏览器的文件名编码处理,确保了文件下载在各种浏览器中的兼容性。

com/ruoyi/common/utils/file/MimeTypeUtils.java

package com.ruoyi.common.utils.file;

/**
 * 媒体类型工具类
 * 
 * @author ruoyi
 */
public class MimeTypeUtils
{
    public static final String IMAGE_PNG = "image/png";

    public static final String IMAGE_JPG = "image/jpg";

    public static final String IMAGE_JPEG = "image/jpeg";

    public static final String IMAGE_BMP = "image/bmp";

    public static final String IMAGE_GIF = "image/gif";
    
    public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };

    public static final String[] FLASH_EXTENSION = { "swf", "flv" };

    public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
            "asf", "rm", "rmvb" };

    public static final String[] DEFAULT_ALLOWED_EXTENSION = {
            // 图片
            "bmp", "gif", "jpg", "jpeg", "png",
            // word excel powerpoint
            "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
            // 压缩文件
            "rar", "zip", "gz", "bz2",
            // pdf
            "pdf" };

    public static String getExtension(String prefix)
    {
        switch (prefix)
        {
            case IMAGE_PNG:
                return "png";
            case IMAGE_JPG:
                return "jpg";
            case IMAGE_JPEG:
                return "jpeg";
            case IMAGE_BMP:
                return "bmp";
            case IMAGE_GIF:
                return "gif";
            default:
                return "";
        }
    }
}

以下是对这段 Java 代码的分析:

**一、功能概述**

这个类是一个媒体类型工具类,主要用于定义和处理不同媒体类型的常量以及提供根据媒体类型前缀获取文件扩展名的方法。

**二、常量定义**

1. 定义了多种常见图像类型的常量,如`IMAGE_PNG`、`IMAGE_JPG`、`IMAGE_JPEG`、`IMAGE_BMP`、`IMAGE_GIF`,分别对应不同的图像媒体类型字符串表示。
2. 定义了三个数组常量`IMAGE_EXTENSION`、`FLASH_EXTENSION`、`MEDIA_EXTENSION`,分别表示允许的图像文件扩展名列表、Flash 文件扩展名列表和多媒体文件扩展名列表。
3. `DEFAULT_ALLOWED_EXTENSION`是一个默认的允许上传文件扩展名列表,包含了多种常见的文件类型,如图片、办公文档、压缩文件和 PDF 文件等。

**三、方法分析**

1. `getExtension(String prefix)`:
   - 这个方法根据传入的媒体类型前缀字符串,判断并返回对应的文件扩展名。如果传入的前缀不在已知的媒体类型范围内,则返回空字符串。

**三、用途和优势**

这个工具类可以在文件上传、处理和验证等场景中,方便地检查文件的媒体类型和扩展名是否符合要求。通过定义常量和提供获取扩展名的方法,提高了代码的可读性和可维护性。

**四、可能的改进点**

1. 可以考虑将媒体类型的定义扩展到更多的文件类型,以满足更广泛的应用需求。
2. 方法`getExtension`可以添加一些错误处理,例如当传入非法的媒体类型前缀时,可以抛出一个自定义的异常,而不是简单地返回空字符串。

 

以下是对这三段 Java 代码的分析以及它们之间的联系:

**一、FileUploadUtils 类**

1. **功能**:
   - 主要作为文件上传工具类。它提供了文件上传的功能,包括对上传文件的文件名长度、文件大小、文件类型进行校验。同时,对文件名进行编码处理,确定文件的存储路径,并将文件保存到指定位置。
2. **关键方法**:
   - `upload`方法:用于上传文件,根据给定的基目录、上传文件和允许的文件扩展名进行上传操作。
   - `extractFilename`方法:提取文件名,包括对原始文件名进行编码并结合日期和文件扩展名生成新的文件名。
   - `assertAllowed`方法:进行文件大小和类型的校验。

**二、FileUtils 类**

1. **功能**:
   - 提供一系列文件处理相关的功能。包括输出文件的字节数组到输出流、删除文件、验证文件名合法性、设置文件下载头部信息以适应不同浏览器、获取系统临时目录以及创建临时文件等操作。
2. **关键方法**:
   - `writeBytes`方法:将指定文件的内容以字节数组形式输出到输出流。
   - `deleteFile`方法:删除指定路径的文件。
   - `isValidFilename`方法:验证文件名是否合法。
   - `setFileDownloadHeader`方法:根据请求的用户代理设置文件下载头部信息。
   - `createTempFile`方法:创建临时文件并写入给定的字节数组数据。

**三、MimeTypeUtils 类**

1. **功能**:
   - 定义了不同媒体类型的常量,并提供根据媒体类型前缀获取文件扩展名的方法。主要用于处理文件的媒体类型相关操作。
2. **关键方法**:
   - `getExtension`方法:根据传入的媒体类型前缀返回对应的文件扩展名。

**联系**:

这三个类在文件处理的不同方面相互配合:

1. `FileUploadUtils`在文件上传过程中,可能会调用`FileUtils`的一些方法来处理文件的存储和校验。例如,在确定文件存储路径时可能会用到类似`FileUtils`中获取绝对文件路径的逻辑。同时,在文件类型校验时,会使用`MimeTypeUtils`中定义的允许文件扩展名列表来判断上传文件的类型是否合法。
2. `FileUtils`在处理文件的各种操作中,可能会涉及到不同媒体类型的文件。例如,在设置文件下载头部信息时,可能需要根据文件的媒体类型进行不同的编码处理,这时候可以参考`MimeTypeUtils`中定义的媒体类型常量。
3. `MimeTypeUtils`提供的媒体类型常量和方法,可以为`FileUploadUtils`和`FileUtils`在处理文件类型相关的操作中提供支持,确保文件的类型符合预期的处理要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值