首页 > 技术文章 > SpringMVC上传图片

Superb1995 2018-03-27 20:33 原文

1.jar包

 

1.请求的Controller

package rrg.user.controller;

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.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import rrg.response.Msg;
import rrg.util.wxmp.ImageUtil;

@RestController
@RequestMapping("/userupload")
public class UploadUserController {

@RequestMapping(value = "/picture", consumes = "multipart/form-data", method = RequestMethod.POST)
public Msg uopUploadSinglePicture(@RequestParam("userId") Integer userId,@RequestParam("token") String token,@RequestParam("file") CommonsMultipartFile file) {

// 判断文件是否存在
if (!file.isEmpty()) {
return ImageUtil.uploadSingleImage(file, "user");
}else{
return Msg.fail().add("err_code","上传的文件为空");
}
}

@RequestMapping(value = "/multipicture", consumes = "multipart/form-data", method = RequestMethod.POST)
public Msg uopUploadMultiPicture(@RequestParam("userId") Integer userId, @RequestParam("token") String token,
@RequestParam("fileUpload") CommonsMultipartFile[] file) {


// 判断文件是否存在
if (file != null && file.length > 0) {
return ImageUtil.uploadMultiImage(file,"user");

} else {
return Msg.fail().add("err_code", "上传的文件为空!");
}

}


}

 

 

 

2.图片工具类

package rrg.util.wxmp;

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import rrg.response.Msg;

//图片工具类 涉及添加图片水印 判断图片格式等等

public class ImageUtil {

/**
* 判断文件的扩展名是否是要求的图片扩展名 jpeg/jpg/png
*
* @param filename
* 图片的名字
* @return
*/
public static boolean judgeFileSuffix(String filename) {
String reg = ".+(.JPEG|.jpeg|.JPG|.jpg|.PNG|.png)$";
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(filename);
return matcher.find();

}
public static String getFileSuffix(String filename) {
return filename.substring(filename.lastIndexOf(".") + 1);
}

/**
* 读取图片的魔术数字(根据文件的前面几个字节,即常说的魔术数字进行判断,不同文件类型的开头几个字节)
*
* @param imageFile 图片文件
* @return 魔术数字
* @throws IOException
*/
public static String bytesToHexString(File imageFile) throws IOException {
InputStream is = new FileInputStream(imageFile);
byte[] src = new byte[2];
is.read(src);
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}

// 获取图片的宽高属性
// 如果能够正常的获取到一张图片的宽高属性,那肯定这是一张图片,因为非图片文件我们是获取不到它的宽高属性的
public static boolean isImage(File imageFile) {
if (!imageFile.exists()) {
return false;
}
Image img = null;
try {
img = ImageIO.read(imageFile);
if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {
return false;
}
return true;
} catch (Exception e) {
return false;
} finally {
img = null;
}
}

/**
* 添加图片水印
*
* @param srcImgPath
* 目标图片路径,如:C:\\kutuku.jpg
* @param waterImgPath
* 水印图片路径,如:C:\\kutuku.png
* @param addedImagePath
* 添加完水印后输出的图片路径 如:C:\\kutuku.png
* @param x
* 水印图片距离目标图片左侧的偏移量,如果x<0, 则在正中间
* @param y
* 水印图片距离目标图片上侧的偏移量,如果y<0, 则在正中间
* @param alpha
* 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)
* @throws IOException
*/
public final static void addWaterMark(String srcImgPath, String waterImgPath, String addedImagePath, int x, int y,
float alpha) throws IOException {

// 加载目标图片
File file = new File(srcImgPath);
String ext = srcImgPath.substring(srcImgPath.lastIndexOf(".") + 1);
Image image = ImageIO.read(file);
int width = image.getWidth(null);
int height = image.getHeight(null);

// 将目标图片加载到内存。
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(image, 0, 0, width, height, null);

// 加载水印图片。
Image waterImage = ImageIO.read(new File(waterImgPath));
int width_1 = waterImage.getWidth(null);
int height_1 = waterImage.getHeight(null);
// 设置水印图片的透明度。
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));

// 设置水印图片的位置。
int widthDiff = width - width_1;
int heightDiff = height - height_1;
if (x < 0) {
x = widthDiff / 2;
} else if (x > widthDiff) {
x = widthDiff;
}
if (y < 0) {
y = heightDiff / 2;
} else if (y > heightDiff) {
y = heightDiff;
}

// 将水印图片“画”在原有的图片的制定位置。
g.drawImage(waterImage, x, y, width_1, height_1, null);
// 关闭画笔。
g.dispose();

// 保存目标图片。
ImageIO.write(bufferedImage, ext, new File(addedImagePath));
}
/**
*
* @param file
* @param udir
* @param download_url
* @return
*/
public static String uploadImage(CommonsMultipartFile file, String udir, String download_url) {
// 获取当前日期
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String date_yyymmdd_str = sdf.format(d);

// 获取文件名
String ori_file_name = file.getOriginalFilename();
// 判断文件后缀是否符合jpg/png/...
if (ImageUtil.judgeFileSuffix(ori_file_name)) {
String suffix = ImageUtil.getFileSuffix(ori_file_name);
String new_file_name = UUID.randomUUID().toString() + "." + suffix;

String tomcat_path = System.getProperty("catalina.home");
// 水印图片地址
String water_mask_path = tomcat_path + "/upload/setting/watermask.png";
// 存储图片的地址
String path = tomcat_path + "/upload/" + udir + "/images/" + date_yyymmdd_str + "/";
download_url += date_yyymmdd_str + "/" + new_file_name;
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}

path += new_file_name;
File localFile = new File(path);
// 保存图片到本地磁盘
try {
file.transferTo(localFile);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
// return Msg.fail().add("err_code", "保存文件失败!");
return "0";
}
if (!ImageUtil.isImage(localFile)) {
// 该文件不是图片!!危险!!! 必须删除
localFile.delete();
// return Msg.fail().add("err_code", "上传文件被检测出不是图片!已删除!");
return "1";
}
// 添加水印
try {
ImageUtil.addWaterMark(path, water_mask_path, path, -1, -1, (float) 0.5);
} catch (IOException e1) {
e1.printStackTrace();
// return Msg.fail().add("err_code", "添加水印失败!");
return "2";
}
} else {
// return Msg.fail().add("err_code", "文件名不是符合图片的后缀名!");
return "3";
}
return download_url;

}
public static Msg uploadSingleImage(CommonsMultipartFile file, String userType) {
String udir = "";
String download_url = "";

if(userType.equals("admin")){
udir = "admin";
download_url = "/ai/";
}else{
udir = "user";
download_url = "/ui/";
}
String tmp_res = ImageUtil.uploadImage(file, udir, download_url);
switch (tmp_res) {
case "0":
return Msg.fail().add("err_code", "保存文件失败!");
case "1":
return Msg.fail().add("err_code", "上传文件被检测出不是图片!已删除!");
case "2":
return Msg.fail().add("err_code", "添加水印失败!");
case "3":
return Msg.fail().add("err_code", "文件名不是符合图片的后缀名!");

default:
return Msg.success().add("success", HttpUtils.getAddress() + tmp_res);

}

}
public static Msg uploadMultiImage(CommonsMultipartFile[] file,String userType){
String udir = "";
String download_url = "";

if(userType.equals("admin")){
udir = "admin";
download_url = "/ai/";
}else{
udir = "user";
download_url = "/ui/";
}

List<String> imgList = new ArrayList<String>();
for (int i = 0; i < file.length; i++) {

String tmp_res = ImageUtil.uploadImage(file[i], udir, download_url);
switch (tmp_res) {
case "0":
return Msg.fail().add("err_code", "保存文件失败!");
case "1":
return Msg.fail().add("err_code", "上传文件被检测出不是图片!已删除!");
case "2":
return Msg.fail().add("err_code", "添加水印失败!");
case "3":
return Msg.fail().add("err_code", "文件名不是符合图片的后缀名!");

default:
imgList.add(HttpUtils.getAddress() + tmp_res);
break;

}
} // end for

return Msg.success().add("success", imgList);
}

}

 

3.tomcat配置

 1.使用eclipse配置存储图片的目录

 

 2.不是eclipse的情况下

 

 

推荐阅读