zoukankan      html  css  js  c++  java
  • 检验上传图片大小、尺寸、类型的两种实现方案

    做图片上传功能时,我们经常会遇到一个问题就是,就是要对上传的图片进行一个校验,校验的东西包括图片的大小、尺寸(即宽和高)以及图片的类型。

    今天我主要介绍两种方式来进行图片的校验,一种是在前端用js校验,另一种是放在服务器端校验。接下来我们来进行介绍

    第一种:放在前端用js校验

    下面直接贴源代码,注释也写在代码里面

     1 <%@ page language="java" contenttype="text/html; charset=UTF-8" pageencoding="UTF-8"%>
     2 <%@ include file="../common/common_tags.jsp" %>
     3 <!DOCTYPE html>
     4 <html lang="en">
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
     7 <title>素材列表&gt;图片编辑</title>
     8 </head>
     9 <body>
    10 <form action="${path}/materialImage/update.do" method="post">
    11     <input type="file" id="sdfile" name="sdfile" onchange="preImg(this.id,'preview_2');">
    12 </form>
    13 <div id="tip1">
    14 </div>
    15 <div id="tip2">
    16 </div>
    17 <script>
    18 /**图片的大小要求,不超过80KB,单位是KB*/
    19 var size = "80";
    20 /**图片的类型要求(即文件后缀)*/
    21 var suffix = "jpg,png";
    22 /**图片宽高要求,单位是px*/  
    23 var width = "640";
    24 var height = "530";
    25 var suffixList ="";
    26 function preImg(fileid, previewid) 
    27 {    
    28     var name = document.getElementById(fileid).files[0].name;
    29     var curSize = document.getElementById(fileid).files[0].size;
    30     var curSuffix = name.split(".")[1];
    31     console.info(document.getElementById(fileid).files[0])
    32     //1、判断图片大小
    33     if(curSize>size*1024)
    34     {
    35         alert("图片大小不能超过"+size+"KB!");
    36         return;
    37     }  
    38     //2、判断图片类型
    39     if(suffix.indexOf(curSuffix)==-1)
    40     {
    41         suffixList="图片只能以";
    42         for(var j=0;j<suffix.split(",").length;j++)
    43         {
    44             if(j==0)
    45             {
    46                 suffixList+="."+suffix.split(",")[j];
    47             }
    48             else
    49             {
    50                 suffixList+="或."+suffix.split(",")[j];
    51             }
    52         }
    53         suffixList+="结尾!"
    54         alert(suffixList+"");
    55         return;
    56     }
    57     /*
    58    3、 判断图片的尺寸(即宽和高)
    59       现在的问题是,如何读取图片的宽、高
    60       我这里是通过实例化Image对象、加载src 来获取。    
    61     */
    62     var reader = new FileReader();  
    63     var picpreview = document.getElementById(previewid);    
    64     reader.onload = function(e) { 
    65         var data = e.target.result;
    66         //加载图片获取图片真实宽度和高度
    67         var image = new Image();
    68         image.onload=function(){
    69             var w = image.width;
    70             var h = image.height;
    71             if(w!=width || h!=height)
    72             {
    73                 alert("请上传尺寸为尺寸为"+width+"x"+height"的图片,当前图片尺寸为"+w+"x"+h+"!");
    74                 return;
    75             }
    76         }
    77         image.src= data;
    78         picpreview.innerHTML = "<img src='"+this.result+"' class='' style='height: 282px;' />";    
    79     }  
    80     reader.readAsDataURL(document.getElementById(fileid).files[0]);  
    81 }
    82 </script>
    View Code

    第二种:放到服务器端校验

    首先看用到jsp页面是如下

     1 <%@ page language="java" contenttype="text/html; charset=UTF-8" pageencoding="UTF-8"%>
     2 <%@ include file="../common/common_tags.jsp" %>
     3 <!DOCTYPE html>
     4 <html lang="en">
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
     7 <title>素材列表&gt;图片编辑</title>
     8 </head>
     9 <body>
    10 <form action="${path}/materialImage/update.do" method="post">
    11     <input type="file" id="sdfile" name="sdfile" onchange="preImg(this.id ,'preview_2');">
    12 </form>
    13 <div id="tip1">
    14 </div>
    15 <div id="tip2">
    16 </div>
    17 <script>
    18 function preImg(fileid, previewid) 
    19 {    
    20     //异步校验图片格式
    21 $.ajax({
    22     type: "POST",
    23     url: "${path}/materialImage/imageCheck.do",
    24     data: formdata,
    25     contentType: false,
    26     processData: false,
    27     async: false,
    28     cache: false,
    29     success: function(data) {
    30         if (data.result == 0) {
    31             alert("请上传图片JPG或GIF格式的图片!!");
    32             errorCount++;
    33         } else if (data.result == 1) {
    34             alert("请上传图片格式等于" + imgWidth + "×" + imgHeight + " 格式的图片!!");
    35         } else if (data.result == 2) {
    36             imgSize = data.imageSize;
    37             alert("图片大于" + data.imageSize + "K!");
    38         } 
    39     }
    40 }
    41 </script>
    View Code

    再看服务器端代码

      1 package com.lutongnet.cps.material.controller;
      2 
      3 import java.awt.image.BufferedImage;
      4 import java.io.File;
      5 import java.io.IOException;
      6 import java.util.ArrayList;
      7 import java.util.Date;
      8 import java.util.HashMap;
      9 import java.util.Iterator;
     10 import java.util.List;
     11 import java.util.Map;
     12 
     13 import javax.annotation.Resource;
     14 import javax.imageio.ImageIO;
     15 import javax.imageio.ImageReader;
     16 import javax.imageio.stream.ImageInputStream;
     17 import javax.servlet.http.HttpServletRequest;
     18 
     19 import org.apache.commons.fileupload.disk.DiskFileItem;
     20 import org.slf4j.Logger;
     21 import org.slf4j.LoggerFactory;
     22 import org.springframework.http.HttpHeaders;
     23 import org.springframework.stereotype.Controller;
     24 import org.springframework.ui.Model;
     25 import org.springframework.web.bind.annotation.ModelAttribute;
     26 import org.springframework.web.bind.annotation.RequestMapping;
     27 import org.springframework.web.bind.annotation.RequestParam;
     28 import org.springframework.web.bind.annotation.ResponseBody;
     29 import org.springframework.web.multipart.MultipartHttpServletRequest;
     30 import org.springframework.web.multipart.commons.CommonsMultipartFile;
     31 
     32 
     33 /**
     34  * 图片素材Controller
     35  * @author     hehaitao
     36  * @since      1.0
     37  */
     38 @Controller
     39 @RequestMapping(value = "/materialImage")
     40 public class MaterialImageController2 
     41 {
     42     private static Logger log = LoggerFactory.getLogger(MaterialImageController2.class);
     43     
     44    @RequestMapping(value = "/imageCheck")
     45    @ResponseBody
     46    public Map<String,Object> imageCheck(HttpServletRequest request) 
     47            throws IOException
     48    {
     49        Map<String, Object> jsonMap = new HashMap<String, Object>();
     50        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
     51        CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest.getFile("file");
     52        DiskFileItem fi = (DiskFileItem)file.getFileItem(); 
     53        File bigFile = fi.getStoreLocation();
     54        
     55        //判断图片格式必须为JPEG才开始上传
     56        if(checkImageType(bigFile, "JPEG") && (checkImageType(bigFile, "gif")) )
     57        {
     58               log.error("image type error!");
     59            jsonMap.put("result", 0);
     60        }
     61    
     62        if(checkImageElement(bigFile, 1280, 720))
     63        {
     64            log.error("image element error!");
     65            jsonMap.put("result", 1);
     66        }
     67        if(checkImageSize(bigFile, 400) && checkImageType(bigFile, "gif"))
     68        {
     69            log.error("image size too large!");
     70            jsonMap.put("imageName","上传的高清gif");
     71            jsonMap.put("imageSize",400);
     72            jsonMap.put("result", 2);
     73        }
     74        if(checkImageSize(bigFile, 100) && checkImageType(bigFile, "JPEG"))
     75        {
     76            log.error("image size too large!");
     77            jsonMap.put("imageName","上传的高清jpg");
     78            jsonMap.put("imageSize",100);
     79            jsonMap.put("result", 3);
     80        }
     81           
     82        return jsonMap;
     83    }
     84    
     85     /**
     86      * 图片后缀的格式检验
     87      * @param file  文件
     88      * @param imageType  后缀格式,如"JPEG,png.."
     89      * @return true:符合imageType格式; false:不符合
     90      * @throws IOException
     91      */
     92     public static boolean checkImageType(File file, String imageType) throws IOException
     93    {
     94         if(!file.exists())
     95         {
     96             return false;
     97         }
     98            boolean result = false;
     99            ImageInputStream iis = ImageIO.createImageInputStream(file);  
    100            Iterator<ImageReader> readers = ImageIO.getImageReaders(iis); 
    101            ImageReader reader = null;
    102            if(readers.hasNext())
    103            {
    104                reader = readers.next();
    105            }
    106            if(reader.getFormatName().equals(imageType))
    107            {
    108                result = true;
    109            }
    110            //System.out.println(reader.getFormatName());
    111            return result;
    112    }
    113     
    114     /**
    115      * 图片的像素判断
    116      * @param file  文件
    117      * @param imageWidth  图片宽度
    118      * @param imageHeight   图片高度
    119      * @return true:上传图片宽度和高度都小于等于规定最大值
    120      * @throws IOException
    121      */
    122     public static boolean checkImageElement(File file, int imageWidth, int imageHeight) throws IOException
    123     {
    124         boolean result = false;
    125            if(!file.exists())
    126            {
    127                return false;
    128            }
    129            BufferedImage bufferedImage = ImageIO.read(file);
    130            if(bufferedImage != null && bufferedImage.getHeight() == imageHeight && bufferedImage.getWidth() == imageWidth)
    131            {
    132                result = true;
    133            }
    134            return result;
    135     }
    136     
    137     /**
    138      * 检测图片的大小
    139      * @param file 文件
    140      * @param imageSize 图片最大值(KB)
    141      * @return true:上传图片小于图片的最大值
    142      */
    143     public static boolean checkImageSize(File file, int imageSize)
    144     {
    145         boolean result = false;
    146         if(!file.exists())
    147         {
    148             return false;
    149         }
    150         if((file.length() / 1024) <= imageSize)
    151         {
    152             result = true;
    153         }
    154         
    155         return result;
    156     }
    157     
    158    
    159     
    160 }
    View Code
  • 相关阅读:
    02 微服务应用的认证与授权
    01 微服务架构中的服务发现作用以及两种协议的调用区别
    04 redis的数据结构与对象
    03 Spring的事务管理的基本使用
    02 Spring的AOP的基础概念与简单使用
    k8s环境部署
    elk安装
    实现AD域验证登录--
    linux SSH各配置项解释
    Linux学习之SAMBA共享(密码验证)
  • 原文地址:https://www.cnblogs.com/zishengY/p/7241051.html
Copyright © 2011-2022 走看看