IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 判断图片格式 工具类 -> 正文阅读

[大数据]判断图片格式 工具类

依赖

 <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
        </dependency>

package com.jsy.basic.util.utils;

import com.jsy.basic.util.exception.JSYError;
import com.jsy.basic.util.exception.JSYException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Objects;

/**
 * @Description: 判断图片格式
 * @Author: chq459799974
 * @Date: 2020/12/2
 **/
@Slf4j
public class PicUtil {

    public static final String TYPE_JPG = "jpg";
    public static final String TYPE_JPEG = "jpeg";
    public static final String TYPE_JFIF = "jfif";
    public static final String JPG_BYTE = "FFD8FF";
    public static final String TYPE_GIF = "gif";
    public static final String GIF_BYTE = "47494638";
    public static final String TYPE_PNG = "png";
    public static final String PNG_BYTE = "89504E47";
    public static final String TYPE_BMP = "bmp";
    public static final String BMP_TYPE = "424D";
    public static final String TYPE_UNKNOWN = "unknown";

    /**
     * 可用图片格式数组
     */
    public static final String[] AVAILABLE_FORMAT = {TYPE_JPG, TYPE_JPEG, TYPE_BMP, TYPE_GIF, TYPE_PNG,TYPE_JFIF};

    /**
     * 图片文件最大kb
     */
    public static final Integer IMAGE_MAX_SIZE = 5000;


    /**
     * @author YuLF
     * @since 2021/2/22 11:21
     * 图片文件是在指定格式 和 指定大小之内的
     */
    public static void imageQualified(MultipartFile file){
        if( Objects.isNull(file) ){
            throw new JSYException(JSYError.BAD_REQUEST.getCode(),"文件为空");
        }
        String originalFilename = file.getOriginalFilename();
        if( !FilenameUtils.isExtension(originalFilename, AVAILABLE_FORMAT) ){
            throw new JSYException(JSYError.BAD_REQUEST.getCode(), "图片格式没有在可用范围之内!" + Arrays.asList(AVAILABLE_FORMAT));
        }
        long size = file.getSize() / 1024;
        if (size > IMAGE_MAX_SIZE) {
            throw new JSYException(JSYError.REQUEST_PARAM.getCode(), "文件太大了,最大:" + IMAGE_MAX_SIZE + "KB");
        }
    }



    /**
     * byte数组转换成16进制字符串
     */
    public static String bytesToHexString(byte[] src){
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (byte b : src) {
            int v = b & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    /**
     * 根据文件流判断图片类型
     */
    private static String getPicType(FileInputStream fis) {
        //读取文件的前几个字节来判断图片格式
        byte[] b = new byte[4];
        try {
            int read = fis.read(b, 0, b.length);
            String type = Objects.requireNonNull(bytesToHexString(b)).toUpperCase();
            if (type.contains(JPG_BYTE)) {
                return TYPE_JPG;
            } else if (type.contains(PNG_BYTE)) {
                return TYPE_PNG;
            } else if (type.contains(GIF_BYTE)) {
                return TYPE_GIF;
            } else if (type.contains(BMP_TYPE)) {
                return TYPE_BMP;
            }else{
                return TYPE_UNKNOWN;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
    
    /**
     * 获取图片类型
     */
    public static String getPicType(MultipartFile file){
        if(file == null){
            throw new JSYException(JSYError.BAD_REQUEST.getCode(),"文件为空");
        }
        String fileType;
        File tempFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
        try {
            FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile);
            fileType = getPicType(new FileInputStream(tempFile));
            if (tempFile.exists()) {
                boolean delete = tempFile.delete();
                if(!delete){
                    log.error("临时文件资源未被清理...");
                    throw new JSYException(JSYError.INTERNAL);
                }
            }
        }catch (IOException e){
            throw new JSYException(JSYError.INTERNAL);
        }
        return fileType;
    }
    
    /**
     * 判断是否是图片(批量)
     */
    public static boolean isPic(MultipartFile[] files){
        if(files == null || files.length == 0){
            throw new JSYException(JSYError.BAD_REQUEST.getCode(),"请至少上传一个文件");
        }
        for(MultipartFile file : files){
            if(!isPic(file)){
                return false;
            }
        }
        return true;
    }
    
    /**
     * 判断是否是图片
     */
    public static boolean isPic(MultipartFile file){
        if(file == null){
            throw new JSYException(JSYError.BAD_REQUEST.getCode(),"文件为空");
        }
        String fileType;
        File tempFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
        try {
            FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile);
            fileType = getPicType(new FileInputStream(tempFile));
        }catch (IOException e){
            throw new JSYException(JSYError.INTERNAL);
        }
        if (tempFile.exists()) {
                boolean delete = tempFile.delete();
            }
            if(TYPE_UNKNOWN.equals(fileType)){
                return false;
            }
        return true;
    }
    
    /**
     * 验证图片大小和格式
     */
    public static boolean checkSizeAndType(MultipartFile file,long kb){
        long size = file.getSize() / 1024;
        if (size > kb) {
            throw new JSYException(JSYError.BAD_REQUEST.getCode(), "文件太大了,最大:" + kb + "KB");
        }
        return isPic(file);
    }
    
    /**
     * 验证图片大小和格式(批量)
     */
    public static boolean checkSizeAndTypeBatch(MultipartFile[] files,long kb){
        if(files == null || files.length == 0){
            throw new JSYException(JSYError.BAD_REQUEST.getCode(),"请至少上传一个文件");
        }
        for(MultipartFile file : files){
           if(!checkSizeAndType(file, kb)){
               return false;
           }
        }
        return true;
    }
    
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:40:57  更:2022-03-22 20:41:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:48:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码