[文件上传工具类] MultipartFile 统一校验

目录

1. 创建上传文件的统一校验类

包含功能:

-> 1. 多文件上传校验

-> 2. 文件名字校验(特殊符号)

-> 3. 文件后缀校验

2. 使用方式

建议: 在文件上传开始的位置添加

-> 两个重载方法, 单文件 多文件都支持

-> 示例: 直接可以用, 任意位置

 3. 注意: 如果出现红色部分 删除即可, 业务代码


1. 创建上传文件的统一校验类 

包含功能:

-> 1. 多文件上传校验

一般会对文件大小进行限制 超过则禁止上传

-> 2. 文件名字校验(特殊符号)

名字一般传递到后端服务后 会重新生成一个名字, 再上传到资源服务器

-> 3. 文件后缀校验

支持常用的文件格式, 视频格式 音频格式 对后缀不明确的后缀进行拦截

 基础校验工具类 以及常用参数

package *;

import *;
import *;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.Locale;

/**
 * @author pzy
 * @version 3.1.0 大版本更新
 * 文件上传校验的公共方法
 * 严格校验
 */
public class UploadCheckUtils {

    /**
     * 文件大小 10MB(可用于图片和视频区分)
     */
    private static final long FILE_SIZE = 10 * 1024 * 1024;

    /**
     * 只支持图片格式
     */
    public static final String[] YES_IMAGE_SUPPORT = {".jpg", ".jpeg", ".png"};

    /**
     * 只支持视频格式
     */
    public static final String[] YES_VIDEO_SUPPORT = {".mp4", ".avi", ".mp3"};

    /**
     * 只支持音频格式
     */
    public static final String[] YES_AUDIO_SUPPORT = {".mp3"};

    /**
     * 只支持文件格式
     */
    public static final String[] YES_FILE_SUPPORT = {".xlsx", ".xls", ".doc", ".docx", ".txt", ".csv"};


    /**
     * 全部文件(普通文件,图片, 视频,音频)后缀 支持的类型
     */
    private static final String[] FILE_SUFFIX_SUPPORT = {".xlsx", ".xls", ".doc", ".docx", ".txt", ".csv",
            ".jpg", ".jpeg", ".png", ".mp4", ".avi", ".mp3"};

    /**
     * 文件名字 需要排除的字符
     * 废弃:  "(", ")","",".", "——", "_","-"
     */
    private static final String[] FILE_NAME_EXCLUDE = {
            "`", "!", "@", "#", "$", "%", "^", "&", "*" , "=", "+",
            "~", "·", "!", "¥", "……", "(", ")",
            "?", ",", "<", ">", ":", ";", "[", "]", "{", "}", "/", "\\", "|",
            "?", ",", "。", "《", "》", ":", ";", "【", "】", "、"
    };


}

 多文件上传方法 

没有文件报错  

    /**
     * 多文件上传
     *
     * @param multipartFile
     */
    public static void uploadVerify(MultipartFile[] multipartFile) {

        /*校验1: 没有文件时,报错提示*/
        if (multipartFile == null) {
            throw new ThirdServiceException(ResponseEnum.T160000, "上传文件不能为空");
        }

        /*校验2: 上传文件的长度小于等于1 就一个直接校验*/
        if (multipartFile.length <= 1) {
            uploadVerify(multipartFile[0]);
            return;
        }
        /*校验3: 多个文件直接校验*/
        for (MultipartFile uploadFile : multipartFile) {
            uploadVerify(uploadFile);
        }

    }

 统一封装校验方法  

格式 后缀 名称 大小都会进行限制

//        // 校验文件大小(统一校验),配置文件中添加
//        long size = multipartFile.getSize();
//        if(size > FILE_SIZE){
//            throw new RuntimeException("文件大小不能超过10MB!");
//        }

    /**
     * 上传文件校验大小、名字、后缀
     *
     * @param multipartFile multipartFile
     */
    public static void uploadVerify(MultipartFile multipartFile) {
        // 校验文件是否为空
        if (multipartFile == null) {
            throw new RuntimeException("文件不能为空!");
        }

        // 校验文件名字
        String originalFilename = multipartFile.getOriginalFilename();
        if (originalFilename == null) {
            throw new RuntimeException("文件名字不能为空!");
        }

        for (String realKey : FILE_NAME_EXCLUDE) {
            if (originalFilename.contains(realKey)) {
                throw new RuntimeException("文件名字不允许出现' " + realKey + " ' 关键字!");
            }
        }

        // 校验文件后缀
        if (!originalFilename.contains(".")) {
            throw new RuntimeException("文件不能没有后缀!");
        }

        String suffix = originalFilename.substring(originalFilename.lastIndexOf('.'));


//        for (String realFormat : FILE_SUFFIX_SUPPORT) {
        /*校验: 文件格式是否符合要求*/
        if (!Arrays.asList(FILE_SUFFIX_SUPPORT).contains(suffix.toLowerCase(Locale.ROOT))) {
            //throw new RuntimeException("文件格式' " + realFormat + " '不支持,请更换后重试!");
            throw new RuntimeException("文件格式不支持,请更换后重试!");
        }
//        }


    }

 

2. 使用方式

建议: 在文件上传开始的位置添加

-> 两个重载方法, 单文件 多文件都支持

[文件上传工具类] MultipartFile 统一校验_第1张图片

-> 示例: 直接可以用, 任意位置

[文件上传工具类] MultipartFile 统一校验_第2张图片

 3. 注意: 如果出现红色部分 删除即可, 业务代码


补充: 文件上传为何要加层层校验

 文件上传过程可以被恶意用户或黑客传播恶意代码或病毒,或非法获取敏感信息。

  1. 防止文件类型欺骗:恶意用户可能会尝试更改文件扩展名或MIME类型来欺骗系统,以允许上传危险的文件。通过校验文件内容和扩展名等方式,可以避免这种情况的发生。

  2. 防止文件大小超限:限制文件大小是非常重要的,以防止用户上传过大的文件影响服务器性能或导致拒绝服务攻击。

  3. 防止文件包含恶意代码:检查上传的文件是否存在恶意代码(例如病毒、木马等),以防止恶意文件传播和安全风险。

  4. 防止文件参数篡改:对文件参数(名称、路径、大小等)进行校验以确保上传的文件参数与预期的相同,防止黑客使用文件上传功能来修改参数,攻击系统。

同时还需要进行压缩(如图片,视频等)

图片和视频压缩的目的是降低文件大小,以减少占用存储空间和传输带宽,同时还能提高加载速度。压缩后的图像和视频文件不会损失太多的质量,而且基本上不会影响观察效果。另外,压缩后的文件也更容易存储和分享,因为它们需要更少的存储空间和传输带宽。

举个列子: 视频压缩

import java.io.File;
import java.io.IOException;
import it.sauronsoftware.jave.*;

public class VideoCompressionDemo {

    public static void main(String[] args) {
        File source = new File("source.mp4");
        File target = new File("target.mp4");
 
        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("libmp3lame");
        audio.setBitRate(new Integer(64000));
        audio.setChannels(new Integer(1));
        audio.setSamplingRate(new Integer(22050));
        
        VideoAttributes video = new VideoAttributes();
        video.setCodec("mpeg4");
        video.setX(new Integer(640));
        video.setY(new Integer(480));
        video.setBitRate(new Integer(800000));
        video.setFrameRate(new Integer(15));
        
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("mp4");
        attrs.setAudioAttributes(audio);
        attrs.setVideoAttributes(video);
 
        Encoder encoder = new Encoder();
 
        try {
            encoder.encode(new MultimediaObject(source), target, attrs);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InputFormatException e) {
            e.printStackTrace();
        } catch (EncoderException e) {
            e.printStackTrace();
        }
    }

}
 

你可能感兴趣的:(#,第三方服务,java,oss,springboot,MultipartFile)