package com.maizuo.web.controller;

import com.maizuo.domain.Result;
import com.maizuo.util.ConstantsConfig;
import com.maizuo.util.Upload;
import hyxlog.Log;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.List; /**
* Created by qiyang on 2015/6/15 and improved by heisenberg on 2016/04/18
*/
@Controller
@RequestMapping("/api/upload")
public class UploadController {
@RequestMapping(value = "/img", method = RequestMethod.POST)
@ResponseBody
public Result uploadImg(@RequestParam(value = "file", required = false) MultipartFile file, String pathName,
Integer sizeRule, Integer isDeviation, HttpServletRequest request)
throws FileNotFoundException, IOException {
String loghead = "通用接口-上传图片:"; JSONObject json = new JSONObject();
if (file == null) {
Log.info(loghead + "上传失败:文件为空");
return new Result(900001, "", "上传失败:文件为空");
}
if (StringUtils.isBlank(pathName)) {
pathName = ConstantsConfig.getString("DEFALTUPLOADPATH");
}
List<Object> uploadPathNames = ConstantsConfig.getList("UPLOADPATHNAMES");
boolean flag = false;
for (int i = 0; i < uploadPathNames.size(); i++) {
if (pathName.equals(uploadPathNames.get(i))) {
flag = true;
}
}
if (!flag) {
Log.info(loghead + "上传失败:上传路径无效");
return new Result(900001, "", "上传失败:上传路径无效");
}
String fileName = file.getOriginalFilename();
// 获取上传文件扩展名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
// 对扩展名进行小写转换
fileExt = fileExt.toLowerCase();
// 图片文件大小过滤
if (!"jpg".equals(fileExt) && !"jpeg".equals(fileExt) && !"png".equals(fileExt) && !"bmp".equals(fileExt)
&& !"gif".equals(fileExt)) {
Log.info(loghead + "上传失败:无效图片文件类型");
return new Result(900001, "", "上传失败:无效图片文件类型");
}
long fileSize = file.getSize();
Log.info(loghead + "fileInfo:fileName=" + fileName + "&fileSize=" + fileSize);
if (fileSize <= 0) {
Log.info(loghead + "上传失败:文件为空");
return new Result(900001, "", "上传失败:文件为空");
} else if (fileSize > (500 * 1024)) {
Log.info(loghead + "上传失败:文件大小不能超过500K");
return new Result(900001, "", "上传失败:文件大小不能超过500K");
}
File tmpFile = null;
// 判断文件是否为空
if (!file.isEmpty()) {
String uploadPath = request.getSession().getServletContext().getRealPath("/") + "/upload/";
File uploadDir = new File(uploadPath);
if (uploadDir.exists() && uploadDir.isDirectory()) {
String[] childFileNameList = uploadDir.list();
if (childFileNameList != null) {
File temp;
for (int i = 0; i < childFileNameList.length; i++) {
temp = new File(uploadPath + childFileNameList[i]);
if (temp.isFile()) {
temp.delete();
}
}
}
} else {
uploadDir.mkdir();
} try {
Date now = new Date();
String tmpFileName = String.valueOf(now.getTime()) + Math.round(Math.random() * 1000) + "." + fileExt;
// 文件保存路径
String tmpFilePath = uploadPath + tmpFileName;
tmpFile = new File(tmpFilePath);
file.transferTo(tmpFile);
BufferedImage sourceImg = ImageIO.read(new FileInputStream(tmpFile));
int imgWidth = sourceImg.getWidth();
int imgHeight = sourceImg.getHeight();
System.out.println("上传的图片宽:" + imgWidth);
System.out.println("上传的图片高:" + imgHeight);
// 图片文件尺寸过滤
if (sizeRule == null) {
// 上传到图片服务器
String imgUrl = Upload.upload(tmpFile, "/" + pathName + "/");
json.put("fileName", fileName);
json.put("url", imgUrl);
json.put("imgWidth", imgWidth);
json.put("imgHeight", imgHeight);
return new Result(0, json, "success");
} else {
System.out.println("前端选择图片尺寸规则" + sizeRule);
int ruleWidth = 0;
int ruleHeight = 0;
try {
String imgSizeRule = ConstantsConfig.getString("UPLOADIMG_RULE" + sizeRule);
String imgSizeRule_width_height[] = imgSizeRule.split(",");
String imgSizeRule_width = imgSizeRule_width_height[0];
String imgSizeRule_height = imgSizeRule_width_height[1];
ruleWidth = Integer.parseInt(imgSizeRule_width);
ruleHeight = Integer.parseInt(imgSizeRule_height);
} catch (Exception e) {
System.out.println("没有配置尺寸规则" + sizeRule);
json.put("fileName", fileName);
json.put("imgWidth", imgWidth);
json.put("imgHeight", imgHeight);
return new Result(-1, json, "配置系统没有配置上传图片尺寸规则" + sizeRule
+ ",请前端修改参数sizeRule值或管理员在配置系统配置sizeRule" + sizeRule + "规则对应的配置项");
}
if (isDeviation == null) {
System.out.println("严格限制图片尺寸");
if (ruleWidth == imgWidth && ruleHeight == imgHeight) {
String imgUrl = Upload.upload(tmpFile, "/" + pathName + "/");
json.put("fileName", fileName);
json.put("url", imgUrl);
json.put("imgWidth", imgWidth);
json.put("imgHeight", imgHeight);
return new Result(0, json, "success");
} else {
json.put("fileName", fileName);
json.put("imgWidth", imgWidth);
json.put("imgHeight", imgHeight);
json.put("ruleWidth", ruleWidth);
json.put("ruleHeight", ruleHeight);
return new Result(-1, json, "请上传" + ruleWidth + "*" + ruleHeight + "px的图片");
}
} else {
int deviation = Integer.parseInt(ConstantsConfig.getString("UPLOADIMG_DEVIATION"));
System.out.println("允许尺寸误差在" + deviation + "以内");
if (Math.abs(ruleWidth - imgWidth) <= deviation
&& Math.abs(ruleHeight - imgHeight) <= deviation) {
String imgUrl = Upload.upload(tmpFile, "/" + pathName + "/");
json.put("fileName", fileName);
json.put("url", imgUrl);
json.put("imgWidth", imgWidth);
json.put("imgHeight", imgHeight);
return new Result(0, json, "success");
} else {
json.put("fileName", fileName);
json.put("imgWidth", imgWidth);
json.put("imgHeight", imgHeight);
json.put("ruleWidth", ruleWidth);
json.put("ruleHeight", ruleHeight);
return new Result(-1, json, "请上传" + ruleWidth + "*" + ruleHeight + "px的图片");
}
}
}
} catch (Exception e) {
e.printStackTrace();
Log.info(loghead + "上传失败:文件上传失败");
return new Result(900001, "", "上传失败:文件上传异常");
} finally {
// 删除临时文件
if (tmpFile.exists()) {
tmpFile.deleteOnExit();
Log.info(loghead + "删除临时文件" + tmpFile.getAbsolutePath());
}
}
}
return new Result(-1, json, "后台校验上传图片流程异常");
}
}

本文转自:koushr

springmvc处理上传图片代码(校验图片尺寸、图片大小)的更多相关文章

  1. PHP高效获取远程图片尺寸和大小(转)

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  2. PHP高效获取远程图片尺寸和大小

    /** * 获取远程图片的宽高和体积大小 * * @param string $url 远程图片的链接 * @param string $type 获取远程图片资源的方式, 默认为 curl 可选 f ...

  3. dnmp(docker的lnmp)安装WordPress之后图片上传问题 问题:图片上传大小问题解决和 报错413 Request Entity Too Large

    首先是提示超过图片尺寸和大小, 最后发现都是图片大小的问题, 需要修改php的最大上传size 修改之后查看php配置  已经生效  但是还是报错, 提示返回不是合法的json,  查看控制台, 报错 ...

  4. 基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸

    /** * Created by xx on 15-05-28. * 基于html5 canvas 的客户端异步上传画片的插件 * 在实际应用中,常常要用于上传图片的功能.在现在越来越多的手机weba ...

  5. 将“Cocos2dx-截屏并设置图片尺寸 ”中cocos2d-x代码转换为2.2的代码

    Cocos2dx-截屏并设置图片尺寸: http://www.cocos2dev.com/?p=522 2.2 代码如下: void HelloWorld::screenShoot() { CCSiz ...

  6. 图片尺寸批量resize的matlab并行代码

    在caffe ImageNet例子中有对图片进行resize的部分,文中使用的是linux shell脚本命令: for name in /path/to/imagenet/val/*.JPEG; d ...

  7. 通过input上传图片,判断不同浏览器及图片类型和大小的js代码

    1.jsp页面代码 <form id="userPhoto" name="userPhoto" method="post" actio ...

  8. C#上传图片和生成缩略图以及图片预览

    因工作需要,上传图片要增加MIME类型验证和生成较小尺寸的图片用于浏览.根据网上代码加以修改做出如下效果图: 前台代码如下: <html xmlns="http://www.w3.or ...

  9. angular-file-upload封装为指令+图片尺寸限制

    不了解angular-file-upload基础使用 请先参考http://blog.csdn.net/lai_xu/article/details/49535847 博客地址 下文如果有更好的建议请 ...

随机推荐

  1. ffmpeg编译与移植问题

    1.下载ffmpeg. 下载网址:http://www.ffmpeg.org/download.html 2.解压缩 tar -zxvf ffmpeg-2.0.1.tar.gz 3.配置,生成Make ...

  2. HTML学习有感

    自从到大三之后一直在纠结课下去学些什么,刚开始一直在学PS,当时学的还算可以,可以一段时间不用之后就忘记了,这使我很郁闷!之后一直想学JAVA,跟已经工作的同学讨来了相关的视屏资料以及他培训时的笔记: ...

  3. wampserver解决“不能切换在线”及运行“404问题”

    初次安装使用wampserver2.2,由于各个电脑安装的应用或是电脑型号不一样会出现以下问题: 1.安装后,不能出切换“服务器在线”或是“服务器离线” 2.设置站点后,运行编写好的代码出现404错误 ...

  4. 面试题系列——OSI七层模型

    OSI(开放式系统互联模型)是一个开放性的通行系统互连参考模型,是一个协议规范.它把网络协议从逻辑上分了七层,每一层都有对应的物理设备. OSI七层模型是一种框架性的设计方法,设计的主要目的是为了解决 ...

  5. MySQL 数据库主从复制架构

    前文<MySQL 数据库事务与复制>分析了 MySQL 复制过程中如何保证 binlog 和事务数据之间的一致性,本文进一步分析引入从库后需要保证主从的数据一致性需要考虑哪些方面. 原生复 ...

  6. Backbone源码分析(一)

    距离上一篇博客有一段时间了,期间各种琐事萦绕.最主要的一件是,当我差不多将整个dojo核心源码看完,惊讶的发现dojo1.*的设计以是老态龙钟之象,而我沉溺在dojo中太久,已经不知道前端世界变成了什 ...

  7. 前端编码规范之CSS

    "字是门面书是屋",我们不会去手写代码,但是敲出来的代码要好看.有条理,这还必须得有一点约束~ 团队开发中,每个人的编码风格都不尽相同,有时候可能存在很大的差异,为了便于压缩组件对 ...

  8. SEO:让搜索引擎对你的网站更有亲和力(译)

    人可以通过查看网站信息了解网站的内容,但是搜索引擎只对标签感兴趣,对内容的识别能力是很低的,如何让蜘蛛通过标签认识你的文章内容呢~ 原文网址:http://schema.org/docs/gs.htm ...

  9. Android属性动画源代码解析(超详细)

    本文假定你已经对属性动画有了一定的了解,至少使用过属性动画.下面我们就从属性动画最简单的使用开始. ObjectAnimator .ofInt(target,propName,values[]) .s ...

  10. 慎重管理SQL Server服务的登录(启动)账户和密码

    今天是大年初三,先跟大家拜个年,祝大家新年快乐.今天处理了一个alwaysOn问题——辅助副本因为磁盘空间不足一直显示[未同步——可疑],在日志中可以看到数据库处于挂起状态,与主副本失去同步.原以为只 ...