<dependency>
<groupId>javaxgroupId>
<artifactId>javaee-apiartifactId>
<version>7.0version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>4.2.3.RELEASEversion>
dependency>
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>2.4version>
dependency>
<dependency>
<groupId>commons-codecgroupId>
<artifactId>commons-codecartifactId>
<version>1.9version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.7version>
dependency>
<dependency>
<groupId>commons-langgroupId>
<artifactId>commons-langartifactId>
<version>2.6version>
dependency>
springMVC.xml
----------
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.liujianhome.controller"/>
<mvc:annotation-driven/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/images/**" location="/image/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:default-servlet-handler/>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10485760000"/>
<property name="maxInMemorySize" value="40960"/>
bean>
beans>
system.properties
----------
file.path = /uploadfile/yrfh/user
root.file.path = E:/workspace/test/JcropDemo/target/Jcrop/
html页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html lang="en">
<head>
<base href="<%=basePath%>">
<title>Jcrop Demotitle>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
<script src="js/jquery.min.js">script>
<script src="js/jquery.Jcrop.js">script>
<script src="js/ajaxfileupload.js">script>
<link rel="stylesheet" href="css/jquery.Jcrop.css" type="text/css"/>
<script type="text/javascript">
var jcrop_api;
jQuery(function ($) {
// Create variables (in this scope) to hold the API and image size
var boundx,
boundy,
// Grab some information about the preview pane
$preview = $('#preview-pane'),
$pcnt = $('#preview-pane .preview-container'),
$pimg = $('#preview-pane .preview-container img'),
xsize = $pcnt.width(),
ysize = $pcnt.height();
$('#target').Jcrop({
onChange: updatePreview, // 选框改变时的事件
onSelect: updatePreview, // 选框选定时的事件
onRelease: clearCoords, // 取消选框时的事件
boxWidth: 400,
aspectRatio: 200 / 200
}, function () {
// Use the API to get the real image size
var bounds = this.getBounds();
boundx = bounds[0];
boundy = bounds[1];
// Store the API in the jcrop_api variable
jcrop_api = this;
// Move the preview into the jcrop container for css positioning
$preview.appendTo(jcrop_api.ui.holder);
});
function updatePreview(c) {
if (parseInt(c.w) > 0) {
var rx = xsize / c.w;
var ry = ysize / c.h;
$pimg.css({
width: Math.round(rx * boundx) + 'px',
height: Math.round(ry * boundy) + 'px',
marginLeft: '-' + Math.round(rx * c.x) + 'px',
marginTop: '-' + Math.round(ry * c.y) + 'px'
});
}
$('#x1').val(c.x);
$('#y1').val(c.y);
$('#x2').val(c.x2);
$('#y2').val(c.y2);
$('#w').val(c.w);
$('#h').val(c.h);
};
});
function clearCoords() {
$('#coords input[type=text]').val('');
}
;
function cutImg() {
// 提交裁剪图片
$.ajax({
type: "post",
url: "/doCutImg",
data: {
"x": parseInt($("#x1").val()),
"y": parseInt($("#y1").val()),
"w": parseInt($("#w").val()),
"h": parseInt($("#h").val()),
"oldImg": $("#oldImg").val()
},
async: false,
success: function (data) {
var jsonObj = eval("(" + data + ")");
if (jsonObj.status == 1) {
$("#cutImg").attr("src", jsonObj.path+"?t="+Math.random());
} else {
alert("图片上传失败!");
}
}
});
}
function ajaxUpFile() {
$.ajaxFileUpload
(
{
url: '/ajaxFileUpload', //用于文件上传的服务器端请求地址
secureuri: false, //是否需要安全协议,一般设置为false
fileElementId: "ajaxFileId", //文件上传域的ID
dataType: 'json', //返回值类型 一般设置为json
data: {'format': 'gif,jpg,jpeg,png,bmp'},
// data: {'format': 'gif,bmp'},
success: function (data, status) //服务器成功响应处理函数
{
if(data[0].status == 1) {
$("#ajaxUpFileImg").attr("src", data[0].path);
}else{
alert(data[0].message);
}
},
error: function (data, status, e)// 服务器响应失败处理函数
{
alert(data + "-" + e + "-" + status);
}
}
)
}
script>
<style type="text/css">
/* Apply these styles only when #preview-pane has
been placed within the Jcrop widget */
.jcrop-holder #preview-pane {
display: block;
position: absolute;
z-index: 2000;
top: 10px;
right: -280px;
padding: 6px;
border: 1px rgba(0, 0, 0, .4) solid;
background-color: white;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
}
/* The Javascript code will set the aspect ratio of the crop
area based on the size of the thumbnail preview,
specified here */
#preview-pane .preview-container {
width: 250px;
height: 250px;
overflow: hidden;
}
style>
head>
<body>
<img src="/image/1111.jpg" id="target" alt="[Jcrop Example]"/>
<div id="preview-pane">
<div class="preview-container">
<img src="/image/1111.jpg" id="" class="jcrop-preview" alt="Preview"/>
div>
div>
<form id="coords" method="post"
class="coords"
action="">
<div class="inline-labels">
<label>X1 <input type="text" size="4" id="x1" name="x1"/>label>
<label>Y1 <input type="text" size="4" id="y1" name="y1"/>label>
<label>X2 <input type="text" size="4" id="x2" name="x2"/>label>
<label>Y2 <input type="text" size="4" id="y2" name="y2"/>label>
<label>W <input type="text" size="4" id="w" name="w"/>label>
<label>H <input type="text" size="4" id="h" name="h"/>label>
<input type="hidden" id="oldImg" value="/image/1111.jpg" name="oldImg"/>
div>
<input type="button" onclick="cutImg()" value="上传截图"/>
form>
<hr>
<img id="cutImg">
<hr>
<h1>提交Form文件上传Demoh1>
<form action="/doFileUpload" method="post" enctype="multipart/form-data">
<p><input type="file" name="file" id="file" value="普通文件"/>p>
<p><input type="submit" value="普通上传"/>p>
form>
<hr>
<h1>用ajaxFileUpload上传Demoh1>
<p><input type="file" name="ajaxFile" id="ajaxFileId" value="ajax上传文件"/>p>
<p><input type="button" onclick="ajaxUpFile()" value="ajax上传"/>p>
<p><img id="ajaxUpFileImg"/>p>
body>
html>
Java 代码
package com.liujianhome.controller;
import com.liujianhome.util.*;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* !
*
* @author liujian
* @version 2016/7/1 0001
*/
@Controller
public class JcropController {
@RequestMapping("/init")
public ModelAndView test() {
return new ModelAndView("/result.jsp");
}
/**
* 上传裁剪图片
*
* @param oldImg
* @param y
* @param x
* @param w
* @param h
* @return
*/
@RequestMapping(value = "/doCutImg", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
@ResponseBody
public String doCutImg(String oldImg, int y, int x, int w, int h, HttpServletRequest request) {
FileEntity fileEntity = null;
try {
fileEntity = FileCommon.saveImage(oldImg, y, x, w, h);
if (fileEntity.getStatus() == 1) {
return JsonUtils.toJsonString(fileEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
return JsonUtils.toJsonString(fileEntity);
}
@RequestMapping(value = "/ajaxFileUpload", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
@ResponseBody
public String ajaxFileUpload(HttpServletRequest request, String format) {
List resultList = FileCommon.doSuperUpFile(request, format);
String resultJson = JsonUtils.toJsonString(resultList);
return resultJson;
}
@RequestMapping(value = "/doFileUpload", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
public String doFileUpload(HttpServletRequest request) {
List resultList = FileCommon.doSuperUpFile(request, null);
return "redirect:/init";
}
}
几个Util包
package com.liujianhome.util;
import org.springframework.util.Base64Utils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
* !
*
* @author liujian
* @version 2016/6/13 0013
*/
public class Common {
/**
* 当前时间格式化!
* @param format
* @return
*/
public static String getCurDateFormat(String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(new Date());
}
}
package com.liujianhome.util;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
* 文件上传公共类!
*
* @author liujian
* @version 2016/6/26 0026
*/
public class FileCommon {
/**
* 创建文件夹
*
* @param dir
*/
private static void doDir(String dir) {
File file = new File(dir);
//如果文件夹不存在则创建
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
}
/**
* 文件上传,支持单个和多个
*
* @param request
* @param format 格式规定,例如:gif,jpg,jpeg,png,bmp
* @return
*/
public static List doSuperUpFile(HttpServletRequest request, String format) {
List resultList = new ArrayList();
// TODO 本地测试
// String rootPath = request.getServletContext().getRealPath("/");
String rootPath = SystemPropertiesUtil.getProperty("root.file.path");
// 定义允许上传的文件扩展名
HashMap extMap = new HashMap();
extMap.put("format", format);
//创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
//转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//取得request中的所有文件名
MultiValueMap iter = multiRequest.getMultiFileMap();
for (Map.Entry> entry : iter.entrySet()) {
//记录上传过程起始时的时间,用来计算上传时间
int pre = (int) System.currentTimeMillis();
//取得上传文件
MultipartFile file = multiRequest.getFile(entry.getKey());
if (format != null) {
if (!Arrays.asList(extMap.get("format").split(","))
.contains(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1))) {
FileEntity fileEntity = new FileEntity();
fileEntity.setStatus(0);
fileEntity.setMessage("上传文件扩展名只允许" + extMap.get("format") + "格式");
resultList.add(fileEntity);
return resultList;
}
}
String fileName = FileCommon.doUpFile(rootPath, file);
if (!"".equals(fileName)) {
FileEntity fileEntity = new FileEntity();
fileEntity.setStatus(1);
fileEntity.setMessage("上传成功");
fileEntity.setPath(fileName);
resultList.add(fileEntity);
}
}
}
return resultList;
}
/**
* 保存图片
*
* @param oldImg 原图路径
* @param top 选择框的左边y坐标
* @param left 选择框的左边x坐标
* @param width 选择框宽度
* @param height 选择框高度
* @return
* @throws IOException
*/
public static FileEntity saveImage(String oldImg,
int top,
int left,
int width,
int height) throws IOException {
String rootFilePath = SystemPropertiesUtil.getProperty("root.file.path");
String newImg = oldImg.substring(0, oldImg.lastIndexOf("."));
String newImgSuf = ImageUtils.getExtension(oldImg).toLowerCase();
String newImgPathNotRoot = newImg + "_cut." + newImgSuf;
String newImgPath = rootFilePath + newImgPathNotRoot;
String oldImgPath = rootFilePath + oldImg;
File fileDest = new File(newImgPath);
if (!fileDest.getParentFile().exists())
fileDest.getParentFile().mkdirs();
String ext = ImageUtils.getExtension(newImgPath).toLowerCase();
BufferedImage bi = (BufferedImage) ImageIO.read(new File(oldImgPath));
height = Math.min(height, bi.getHeight());
width = Math.min(width, bi.getWidth());
if (height <= 0) height = bi.getHeight();
if (width <= 0) width = bi.getWidth();
top = Math.min(Math.max(0, top), bi.getHeight() - height);
left = Math.min(Math.max(0, left), bi.getWidth() - width);
BufferedImage bi_cropper = bi.getSubimage(left, top, width, height);
boolean flag = ImageIO.write(bi_cropper, ext, fileDest);
if (flag) {
FileEntity fileEntity = new FileEntity();
fileEntity.setPath(newImgPathNotRoot);
fileEntity.setMessage("上传成功");
fileEntity.setStatus(1);
return fileEntity;
} else {
FileEntity fileEntity = new FileEntity();
fileEntity.setMessage("上传失败");
fileEntity.setStatus(0);
return fileEntity;
}
}
/**
* 文件上传规则
*
* @param rootPath
* @param file
* @return
*/
private static String doUpFile(String rootPath, MultipartFile file) {
if (file != null) {
//取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
//如果名称不为“”,说明该文件存在,否则说明该文件不存在
if (myFileName.trim() != "") {
// 该项目的文件路径
String filePath = SystemPropertiesUtil.getProperty("file.path");
// 文件的相对路径
String relativeFilePath = filePath + "/" + Common.getCurDateFormat("yyyyMMdd");
// 文件的绝对路径
String absoluteFilePath = rootPath + relativeFilePath;
// 创建文件夹
doDir(absoluteFilePath);
// 重命名文件名
String fileName = System.currentTimeMillis() + "." + ImageUtils.getExtension(myFileName);
// 上传文件绝对路径
String path = absoluteFilePath + "/" + fileName;
File localFile = new File(path);
try {
file.transferTo(localFile);
return relativeFilePath + "/" + fileName;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "";
}
}
package com.liujianhome.util;
/**
* 文件上传返回信息实体!
*
* @author liujian
* @version 2016/7/7 0007
*/
public class FileEntity {
// 文件上传状态 (1:成功, 0:失败)
private int status;
// 文件上传地址
private String path;
// 上传状态消息
private String message;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
package com.liujianhome.util;
import java.io.File;
/**
* !
*
* @author liujian
* @version 2016/6/28 0028
*/
public class ImageUtils {
public static String getExtension(File f) {
return (f != null) ? getExtension(f.getName()) : "";
}
public static String getExtension(String filename) {
return getExtension(filename, "");
}
public static String getExtension(String filename, String defExt) {
if ((filename != null) && (filename.length() > 0)) {
int i = filename.lastIndexOf('.');
if ((i > -1) && (i < (filename.length() - 1))) {
return filename.substring(i + 1);
}
}
return defExt;
}
public static String trimExtension(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int i = filename.lastIndexOf('.');
if ((i > -1) && (i < (filename.length()))) {
return filename.substring(0, i);
}
}
return filename;
}
}
package com.liujianhome.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.lang.StringUtils;
import java.util.List;
import java.util.Map;
public class JsonUtils {
// fastjson 的序列化配置
public final static SerializeConfig fastjson_serializeConfig_noYear = new SerializeConfig();
public final static SerializeConfig fastjson_serializeConfig_time = new SerializeConfig();
public final static SerializeConfig fastjson_free_datetime = new SerializeConfig();
// 默认打出所有属性(即使属性值为null)|属性排序输出,为了配合历史记录
private final static SerializerFeature[] fastJsonFeatures = { SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteEnumUsingToString, SerializerFeature.SortField };
public static T getValue(String text, String key, Class clazz ) {
Map map = (Map) jsonToMap(text);
T result = (T) map.get(key);
return result;
}
public static T parseObject(String item, Class clazz) {
if (StringUtils.isBlank(item)) {
return null;
}
return JSON.parseObject(item, clazz);
}
public static final List parseArray(String text, Class clazz) {
if (StringUtils.isBlank(text)) {
return null;
}
return JSON.parseArray(text, clazz);
}
public static String toJsonString(Object object) {
return toJsonString(object, fastjson_serializeConfig_noYear);
}
public static String toJsonString(Object object, SerializeConfig serializeConfig) {
if (null == object) {
return "";
}
return JSON.toJSONString(object, serializeConfig, fastJsonFeatures);
}
public static Map, ?> jsonToMap(String json) {
if (StringUtils.isBlank(json)) {
return null;
}
return (Map, ?>) JSON.parse(json);
}
public static Map, ?> objectToMap(Object object) {
String json = toJsonString(object);
if (StringUtils.isBlank(json)) {
return null;
}
return (Map, ?>) JSON.parse(json);
}
public static String mapToJson(Map, ?> params) {
if (null == params || params.isEmpty()) {
return null;
}
return JSON.toJSONString(params, true);
}
}
package com.liujianhome.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* !
*
* @author liujian
* @version 2016/5/23 0023
*/
public class SystemPropertiesUtil {
static Properties prop = new Properties();
static {
InputStream in = SystemPropertiesUtil.class.getResourceAsStream("/system.properties");
try {
prop.load(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getProperty(String key) {
String value = prop.getProperty(key).trim();
return value;
}
}