html页面
controller页面
package com.hhsj.FreeBird.controller;
import com.alibaba.fastjson.JSONObject;
import com.hhsj.FreeBird.pojo.Userinfo;
import com.hhsj.FreeBird.service.UserInfoService;
import com.hhsj.FreeBird.util.JsonResult;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.Thumbnails.Builder;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
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.commons.CommonsMultipartFile;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.UUID;
//import org.springframework.web.multipart.commons.CommonsMultipartFile;
@Controller
public class UploadController {
/**
* 头像上传
*
* @param file 图片的基本信息
* @param fileCut 前台剪切图片的基本信息
* @param request
* @return
*/
@Resource
private UserInfoService userInfoService;
@RequestMapping("/h5upload")
@PostMapping("/h5upload")
@ResponseBody
public JsonResult h5upload(
@RequestParam(value = "avatar_file", required = true) MultipartFile file,
@RequestParam(value = "avatar_data", required = true) String fileCut,
HttpSession session) {
JsonResult jsonResult = new JsonResult();
try {
//获取根目录
File path = new File(ResourceUtils.getURL("classpath:").getPath());
if (!path.exists()) {path = new File("");}
//上传目录为/static/images/upload/
//在开发测试模式时,得到的地址为:{项目跟目录}/target/static/images/qq/
//在打包成jar正式发布时,得到的地址为:{发布jar包目录}/static/images/qq/
File root = new File(path.getAbsolutePath(), "static/images/qq/");
if (!root.exists()) root.mkdirs();
String orgFileName = file.getOriginalFilename();// 获取图片的名字
String fileName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(orgFileName);
File targetFile = new File(root, fileName);
//multipartfile 转 File对象
CommonsMultipartFile cf = (CommonsMultipartFile) file;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
File f = fi.getStoreLocation();
file.transferTo(f);
// JSON的对象格式的字符串转换成json数据
JSONObject json = JSONObject.parseObject(fileCut);
String x = json.get("x").toString();
String y = json.get("y").toString();
String width = json.get("width").toString();
String height = json.get("height").toString();
// 下面的要的数据时int类型,把小数去掉
if (x.indexOf(".") > -1) {
x = x.substring(0, x.indexOf("."));
}
if (y.indexOf(".") > -1) {
y = y.substring(0, y.indexOf("."));
}
if (width.indexOf(".") > -1) {
width = width.substring(0, width.indexOf("."));
}
if (height.indexOf(".") > -1) {
height = height.substring(0, height.indexOf("."));
}
// 剪切图片
BufferedImage image = ImageIO.read(f);
image = image.getSubimage(Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(width),
Integer.parseInt(height));
// 压缩边长为100的正方形, 生成图片 到指定的位置
Builder builder = null;
builder = Thumbnails.of(image).size(100, 100);
builder.toFile(targetFile);
//更新用户头像
jsonResult.setFlag(true);
jsonResult.setResult("images/qq/" + fileName);
Userinfo user = (Userinfo) session.getAttribute("user");
user.setAvatar(fileName);
userInfoService.update(user);
} catch (Exception e) {
jsonResult.setFlag(false);
e.printStackTrace();
}
return jsonResult;
}
}
工具类
package com.hhsj.FreeBird.util;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
/**
* Created by JacksonYee on 2019/7/18.
*/
@Configuration
public class BaseConfig {
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver(){
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");
resolver.setResolveLazily(true);//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
resolver.setMaxInMemorySize(40960);
resolver.setMaxUploadSize(50*1024*1024);//上传文件大小 50M 50*1024*1024
return resolver;
}
}
package com.hhsj.FreeBird.util;
public class JsonResult {
private String msg;
private String result;
private boolean flag;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public JsonResult() {
super();
}
public JsonResult(String msg, String result, boolean flag) {
super();
this.msg = msg;
this.result = result;
this.flag = flag;
}
}
package com.hhsj.FreeBird.util;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.Thumbnails.Builder;
import net.coobird.thumbnailator.geometry.Positions;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
/**
* 图片上传工具
*/
public class UploadUtil {
/**
* 处理文件上传
*
* @param file
* @param basePath
* 图片要上传到的服务器路径
* @return
* @throws IOException
*/
public static String upload(MultipartFile file, String basePath) throws IOException {
// 创建文件夹
File uploadFile = new File(basePath);
if (!uploadFile.exists()) {
uploadFile.mkdirs();
}
String orgFileName = file.getOriginalFilename();//获取图片的名字
String fileName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(orgFileName);
File targetFile = new File(basePath, fileName);
// multipartfile 转 File对象
CommonsMultipartFile cf = (CommonsMultipartFile) file;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
File f = fi.getStoreLocation();
compressPicture(f, targetFile);
// 下面这个是按比例压缩的,最后得到的图片可能不是正方形
// Thumbnails.of(f).size(50, 50).toFile(targetFile);
return fileName;
}
// 压缩至指定图片尺寸(例如:横50高50),保持图片不变形,多余部分裁剪掉
public static void compressPicture(File fromPic, File toPic) throws IOException {
BufferedImage image = ImageIO.read(fromPic);
Builder<BufferedImage> builder = null;
int imageWidth = image.getWidth();
int imageHeitht = image.getHeight();
if ((float) 50 / 50 != (float) imageWidth / imageHeitht) {
if (imageWidth > imageHeitht) {
image = Thumbnails.of(fromPic).height(50).asBufferedImage();
} else {
image = Thumbnails.of(fromPic).width(50).asBufferedImage();
}
builder = Thumbnails.of(image).sourceRegion(Positions.CENTER, 50, 50).size(50, 50);
} else {
builder = Thumbnails.of(image).size(50, 50);
}
builder.outputFormat("jpg").toFile(toPic);
}
}
在启动类之前加上
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})