服务器端对图片进行处理的过程可分为图片上传和图片保存,当服务器端拿到图片后需要进行处理并保存到服务器上。通过使用thumbnailator库可以便捷地实现对图片的操作。如下所示通过maven引入该依赖
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.11</version>
</dependency>
如下所示,在ImageUtil类中,实现generateThumbnail()方法来形成一个缩略图并保存到服务器,首先调用makeDir创建保存图片的目标文件夹,makeDir()会拼接出保存图片的绝对路径,如果该文件夹不存在则创建。然后调用FileUtil的getRandomFilename()生成随意文件名字符串,这样做是为了防止同名图片文件。通过getFileExtension()获得文件扩展名并和targetAddr、filename拼接为文件的相对路径,再加上ImgFolder得到绝对路径。
之后调用Thumbnails对象对图片进行操作:of()获取原图片源,size()调整图片大小,outputQuality()对图片进行压缩、watermark添加水印,toFile()保存图片结果。
package com.tory.shop.util;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageUtil {
public static String generateThumbnail(CommonsMultipartFile imgFile,String targetAddr){
makeDir(targetAddr); //创建保存图片的目标文件夹
String filename=FileUtil.getRandomFilename(); //返回随机文件名
String extension=FileUtil.getFileExtension(imgFile); //获得文件扩展名
String relativePath=targetAddr+filename+extension;
String absolutePath=FileUtil.getImgFolder()+relativePath; //拼接得到存储文件的绝对路径
try {
BufferedImage watermark= ImageIO.read(new File(FileUtil.getImgFolder()+"watermark.png"));
Thumbnails.of(imgFile.getInputStream()) //获取原图片
.size(200,200) //调整图片大小
.outputQuality(0.25) //压缩图片大小
.watermark(Positions.BOTTOM_RIGHT,watermark,0.25f) //添加水印
.toFile(new File(absolutePath)); //输出目标文件
} catch (IOException e) {
throw new RuntimeException("创建缩略图失败:" + e.toString());
}
return relativePath; //返回生成图片的相对路径
}
//创建保存图片的目标文件夹
private static void makeDir(String targetAddr){
String absolutePath=FileUtil.getImgFolder()+targetAddr;
File targetFile=new File(absolutePath);
if (!targetFile.exists())
targetFile.mkdirs();
}
}
如下所示为实现ImageUtil方法时用到的FileUtil类,随机文件名是指通过Random生成五位随机数,然后再拼接上时间字符串来保证图片名不会相同冲突。
文件扩展名即文件名最后一个“."之后的字符串
getImgFolder()用于返回图片根目录,不同服务器的图片存放位置可能不同,而且Windows和Linux文件分隔符可能也不一样,Windows是“\”,Linux是“/”,因此要针对不同服务器进行替换处理。
package com.tory.shop.util;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class FileUtil {
private static String fileSeparator = System.getProperty("file.separator");
//返回随机文件名
public static String getRandomFilename() {
int randomNum = new Random().nextInt(9999) + 10000; //生成五位的随机数
String timeStr = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
return timeStr + randomNum;
}
//获取文件扩展名
public static String getFileExtension(CommonsMultipartFile file) {
String filename = file.getOriginalFilename();
return filename.substring(filename.lastIndexOf('.'));
}
//返回项目图片存放根目录
public static String getImgFolder() {
String imgFolder = "";
if (System.getProperty("os.name").toLowerCase().startsWith("win"))
imgFolder = "D:/Java/Web/ShopDemo/images/";
imgFolder = imgFolder.replace("/", fileSeparator); //根据不同系统替换文件分割符
return imgFolder;
}
}