检验上传图片大小、尺寸、类型的两种实现方案

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

今天我主要介绍两种方式来进行图片的校验,一种是在前端用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>

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

首先看用到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>

再看服务器端代码

  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 }

时间: 07-25

检验上传图片大小、尺寸、类型的两种实现方案的相关文章

测试当前机器的大小端模式(两种方法)

方法一: #include <stdio.h> int check_sys() {  int i = 1;  int *p = &i;  char *q = (char *)p;  if (*q == 1)  {   return 0;  }  else  {   return 1;  } } int main() {  int ret = check_sys();  if (ret == 1)  {   printf("big\n");  }  else  {  

ImageButton介绍及两种透明方案

java.lang.Object android.view.View android.widget.ImageView android.widget.ImageButton 直接子类: ZoomButton 类摘要: 显示一个可以被用户点击的图片按钮,默认情况下,ImageButton看起来像一个普通的按钮,在不同状态(如按下)下改变背景颜色.按钮的图片可用通过<ImageButton> XML元素的android:src属性或setImageResource(int)方法指定. 要删除按钮的

从源代码剖析Struts2中用户自定义配置转换器的两种方式——基于字段的配置转换器和基于类型的配置转换器(解决了实际系统中,因没有区分这两种工作方式的生命周期而引起的异常错误问题)

自定义类型转换器必须实现ongl.TypeConverter接口或对这个接口的某种具体实现做扩展 <<interface>>com.opensymphony.xwork2.conversion.TypeConverter à com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter à org.apache.struts2.util.StrutsTypeConverter 接口及类进行解析 TypeConverter(

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯.这个将 程序数据转化成能被存储并传输的格式的过程被称为"序列化"(Serialization),而它的逆过程则可被称为"反序列化" (Deserialization). 简单

opengl两种投影类型

openGL两种投影方式 from http://hi.baidu.com/fcqian/blog/item/cc5794ec76807a3f27979131.html 投影变换是一种很关键的图形变换,OpenGL中只提供了两种投影方式,一种是正射投影,另一种是透视投影.不管是调用哪种投影函数,为了避免不必要的变换,其前面必须加上以下两句: glMAtrixMode(GL_PROJECTION); glLoadIdentity(); 事实上,投影变换的目的就是定义一个视景体,使得视景体外多余的部

在装完Linux系统之后自己去修改Swap分区的大小(两种方法)

在装完Linux系统之后自己去修改Swap分区的大小(两种方法) 在安装完Linux系统后,swap分区太小怎么办,怎么可以扩大Swap分区呢?有两个办法,一个是从新建立swap分区,一个是增加swap分区.下面介绍这两种方法: 第一您必须有root权限,过程中一定要很小心,一不小心就破坏了整个硬盘的数据,执行下面的过程之前您需要三思而行,错误操作后的后果由执行者自己承担. 新建swap分区 1.以root身份进入控制台,输入 # swapoff -a          #停止交换分区 2. 用

【转】java中byte数组与int类型的转换(两种方式)----不错

原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型.下面有两种方式. 第一种方法: public static byte[] int2byte(int

socket编程之二:两种链接类型upd和upd

前面一篇文章说到了一些计算机网络的基础知识,引入了socket,从这节开始,就进入正题了. 一 概率 TCP:Transimission Control Protocol传输控制协议. UPD:User Datagram Protocol用户数据包协议. 两者都属于上一篇文章说的OSI模型中的第四层--传输层的协议. 两者相比: TCP协议面向连接,UDP协议面向非连接:(链接) TCP协议传输速度慢,UDP协议传输速度快:(速度) TCP有丢包重传机制,UDP没有:(重传) TCP协议保证数据

【C++】用函数模板实现不同类型的两个数比较大小

//用函数模板实现不同类型的两个数比较大小 #include <iostream> using namespace std; template <class mytype> //定义函数模板 class Max { public: Max(mytype a, mytype b) { x=a; y=b; } mytype printMax() { return x>y?x:y; } private: mytype x,y; }; int main() { Max <int