使用Thumbnailator 上传图片 并压缩图片
引入依赖
<!-- 图片缩略图 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
<!-- IO工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
工具类:ImageUtil
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import com.leopard.util.bean.ImageResult;
import com.leopard.util.enums.SystemCodeAndMsg;
import com.leopard.util.number.MathUtil;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.Thumbnails.Builder;
/**
* 图片工具类
* @author leopard
*
*/
public class ImageUtil {
/**
* 简单上传图片,不做任何处理
*
* @param imagePath
* 目标文件夹路径
* @param imageName
* 图片名称
* @param inputStream
* 输出流
* @return
*/
public static ImageResult uploadImage(String imagePath, String imageName, InputStream inputStream) {
BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null;
if (!"/".equals(imagePath.substring(imagePath.length() - 1, imagePath.length()))
&& !"\\".equals(imagePath.substring(imagePath.length() - 1, imagePath.length()))) {
imagePath += "/";
}
File realFile = new File(imagePath);
// 不存在文件夹则创建
if (!realFile.exists())
realFile.mkdirs();
try {
// 新建文件输入流并对它进行缓冲
inBuff = new BufferedInputStream(inputStream);
// 新建文件输出流并对它进行缓冲
outBuff = new BufferedOutputStream(new FileOutputStream(imagePath + "/" + imageName));
// 缓冲数组
byte[] b = new byte[1024 * 5];
int len;
while ((len = inBuff.read(b)) != -1) {
outBuff.write(b, 0, len);
}
// 刷新此缓冲的输出流
outBuff.flush();
} catch (FileNotFoundException a) {
a.printStackTrace();
return ImageResult.error("目标文件夹找不到");
} catch (IOException e) {
e.printStackTrace();
return ImageResult.error("操作流异常!");
} finally {
// 关闭流
try {
if (inBuff != null)
inBuff.close();
if (outBuff != null)
outBuff.close();
} catch (IOException c) {
c.printStackTrace();
}
}
StringBuffer result = new StringBuffer(imagePath);
result.append(imageName);
return ImageResult.success(result.toString(), null);
}
/**
* 图片名生成
*/
public static String genImageName() {
// 取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
// 加上三位随机数
int end3 = MathUtil.getNumRandom(3);
// 如果不足三位前面补0
String str = millis + String.format("%03d", end3);
return str;
}
/**
* 保存图片并且生成缩略图
*
* @param imagePath
* 目标文件夹路径
* @param imageName
* 图片名称
* @param inputStream
* 输出流
* @param fileSize
* 文件大小
* @param width
* 期望宽度
* @param height
* 期望高度
* @return
*/
public static ImageResult uploadFileAndCreateThumbnail(String imagePath, String imageName, InputStream inputStream,
long fileSize, int width, int height) {
if (width == 0 || height == 0) {
return ImageResult.error("请设置缩略图宽高!");
}
// 保存源文件
ImageResult uploadImage = uploadImage(imagePath, imageName, inputStream);
if (!SystemCodeAndMsg.SUCCESS.code().equals(uploadImage.getCode())) {
return uploadImage;
}
/*** 缩略图begin */
// 源图片路径
StringBuffer imagePathBuffer = new StringBuffer(imagePath);
// 如果最后不存在斜杆,则自行添加
if (!"/".equals(imagePath.substring(imagePath.length() - 1, imagePath.length()))
&& !"\\".equals(imagePath.substring(imagePath.length() - 1, imagePath.length()))) {
imagePathBuffer.append("/");
}
String filePathName = imagePathBuffer.append(imageName).toString();
// 目标图片(移除后缀 并改名 xxx.jpg
// ->xxxx-small)不含后缀路径,目的在下面的outputFormat(jpg),转化为固定的jpg格式文件
StringBuffer thumbnailFilePathName = new StringBuffer(filePathName.substring(0, filePathName.lastIndexOf(".")))
.append("-small");
thumbnailFilePathName = thumbnailFilePathName.append(".jpg");
String disposeUrl = thumbnailFilePathName.toString();
try {
Builder<File> builderFile = Thumbnails.of(filePathName);
// 压缩200KB
if (fileSize > 200 * 1024) {
builderFile.outputQuality((200 * 1024f) / fileSize);
}
// 按自定义大小比例缩放
builderFile.forceSize(width, height).toFile(disposeUrl);
} catch (Exception e1) {
return ImageResult.error(e1.getMessage());
}
/*** 缩略图end */
return ImageResult.success(uploadImage.getUrl(), disposeUrl);
}
}
返回数据处理实体
/**
* 图片响应
*
* @author leopard
*
*/
public class ImageResult {
/**
* 状态码
*/
private String code;
/**
* 文件原地址
*/
private String url;
/**
* 文件处理后地址
*/
private String disposeUrl;
/**
* 响应信息
*/
private String message;
public ImageResult() {
}
public ImageResult(String code, String url, String disposeUrl, String message) {
this.code = code;
this.url = url;
this.disposeUrl = disposeUrl;
this.message = message;
}
/**
* 成功时调用的方法
*
* @param url
* 源文件路径
* @param disposeUrl
* 文件处理后路径
* @return
*/
public static ImageResult success(String url, String disposeUrl) {
return new ImageResult(SystemCodeAndMsg.SUCCESS.code(), url, disposeUrl, SystemCodeAndMsg.SUCCESS.msg());
}
/**
* 失败时调用的方法
*
* @param message
* 错误信息
* @return
*/
public static ImageResult error(String message) {
return new ImageResult(SystemCodeAndMsg.FAIL.code(), null, null, message);
}
。。。。get/set
}
应用业务层(测试)
@RequestMapping(value = "/savePic", method = RequestMethod.POST)
@ResponseBody
public JSONObject sendSimple(MultipartFile uploadFile) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", SystemCodeAndMsg.WEB_SUCCESS.code());
jsonObject.put("msg", SystemCodeAndMsg.WEB_SUCCESS.msg());
String IMAGE_BASE_URL = "H:";
// 判断上传图片是否为空
if (null == uploadFile || uploadFile.isEmpty()) {
return jsonObject;
}
if (uploadFile.getSize() >= 5 * 1024 * 1024) {
jsonObject.put("msg", "文件不能大于5M");
return jsonObject;
}
// 取文件扩展名
String ext = FilenameUtils.getExtension(uploadFile.getOriginalFilename());
String imageName = ImageUtil.genImageName() + "." + ext;
// 文件在服务器的存放路径,应该使用日期分隔的目录结构
DateTime dateTime = new DateTime();
String filePath = dateTime.toString("yyyy/MM/dd");
String imagePath = IMAGE_BASE_URL + "/uploadImg/" + filePath;
try {
// ImageResult uploadFileAndCreateThumbnail1 = ImageUtil.uploadFileAndChangeSize(imagePath, imageName,
// uploadFile.getInputStream(), uploadFile.getSize());
ImageResult uploadFileAndCreateThumbnail = ImageUtil.uploadFileAndChangeWidthAndHeight(imagePath, imageName,
uploadFile.getInputStream(), 200, 500);
jsonObject.put("msg", uploadFileAndCreateThumbnail.getUrl());
jsonObject.put("msg2", uploadFileAndCreateThumbnail.getDisposeUrl());
} catch (Exception e) {
e.printStackTrace();
return jsonObject;
}
// 返回结果,生成一个可以访问到图片的url返回
return jsonObject;
}
参考文献: