SSM到Spring Boot-校园商铺平台——>第04章 店铺注册功能模块——>4-3 Thumbnailator图片处理和封装Util
所有电商类的java实战项目,都需要实现图片上传功能。本篇博客主要提供一种给上传图片自动实现文件名命名与目录创建。
4-3 Thumbnailator图片处理和封装Util
PathUtil作用是判断当前的操作系统类型,自动用String类的replace方法替换文件路径分隔符:separator
/**
* 根据不同操作系统获取文件上传路径
*
*/
public class PathUtil {
//1.获取当前操作系统的分隔符
private static String separator = System.getProperty("file.separator");
public static String getImgBasePath() {
//2.获取当前操作系统的名称
String os = System.getProperty("os.name");
String basePath = "";
//3.调用String类的常用成员方法判断并替换
if(os.toLowerCase().startsWith("win")) {
basePath = "F:/javaweb/";
}else {
basePath = "/home/ftpuser/www/";
}
basePath = basePath.replace("/", separator);
return basePath;
}
// 根据shopId分配不同的上传目录,在ShopServiceImpl中引用
public static String getShopImagePath(Integer shopId) {
// 获取当前操作系统的名称
String os = System.getProperty("os.name");
String imagePath = "o2o-upload/images/item/shop/" + shopId +"/";
if(os.toLowerCase().startsWith("win")) {
imagePath = imagePath.replace("/", "\\");
}else {
imagePath = imagePath.replace("/", "/");
}
// 返回不包含文件名的相对目录路径
return imagePath;
}
//删除文件夹目录
public static void deleteFile(String storePath) {
File file = new File(getImgBasePath() + storePath);
if (file.exists()) {
if (file.isDirectory()) {
File files[] = file.listFiles();
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
}
file.delete();
}
}
}
ImageUtil的参考价值在于:获取文件的拓展名extension
public class ImageUtil {
//静态成员方法只能访问静态成员变量
private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
private static final SimpleDateFormat S_DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");
private static final Random R5 = new Random();
private static Logger logger = LoggerFactory.getLogger(ImageUtil.class);
/**
* 处理缩略图,并返回新生成图片的相对值路径
* @param thumbnail
* @param targetAddr
* @return
*/
public static String generateThumbnail(MultipartFile thumbnail, String targetAddr) {
String realFileName = getRandomFileName(); //文件的新名字,不包含拓展名
String extension = getFileExtension(thumbnail); //文件的拓展名
makeDirPath(targetAddr);
String relativeAddr = targetAddr + realFileName + extension;
logger.debug("current relativeAddr is:" + relativeAddr);
File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
logger.debug("current complete addr is:" + PathUtil.getImgBasePath() + relativeAddr);
try {
Thumbnails.of(thumbnail.getInputStream())
.size(200, 200).watermark(Positions.BOTTOM_RIGHT,
ImageIO.read(new File(basePath + "/watermark.jpg")),
0.30f).outputQuality(0.8f)
.toFile(dest);
return relativeAddr; //没有异常,则返回相对的目录
} catch (IOException e) {
logger.error(e.toString());
e.printStackTrace();
}
return "error"; //如果有异常,则返回提示信息
}
public static String generateNormalImg(CommonsMultipartFile thumbnail, String targetAddr) {
String realFileName = getRandomFileName();
String extension = getFileExtension(thumbnail);
makeDirPath(targetAddr);
String relativeAddr = targetAddr + realFileName + extension;
File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
try {
Thumbnails.of(thumbnail.getInputStream())
.size(1280, 720).watermark(Positions.BOTTOM_RIGHT,
ImageIO.read(new File(basePath + "/watermark.jpg")),
0.30f).outputQuality(0.8f)
.toFile(dest);
} catch (IOException e) {
throw new RuntimeException("创建普通图片失败:" + e.toString());
}
return relativeAddr;
}
public static List<String> generateNormalImgs(List<CommonsMultipartFile> imgs, String targetAddr) {
int count = 0;
List<String> relativeAddrList = new ArrayList<>();
if (imgs != null && imgs.size() > 0) {
makeDirPath(targetAddr);
for (CommonsMultipartFile img : imgs) {
String realFileName = getRandomFileName();
String extension = getFileExtension(img);
String relativeAddr = targetAddr + realFileName + count + extension;
File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
count++;
try {
Thumbnails.of(img.getInputStream()).size(600, 300).outputQuality(0.8f).toFile(dest);
} catch (IOException e) {
throw new RuntimeException("创建图片失败:" + e.toString());
}
relativeAddrList.add(relativeAddr);
}
}
return relativeAddrList;
}
/**
* 创建目标文件所涉及到的目录
* @param targetAddr
*/
private static void makeDirPath(String targetAddr) {
String realFileParentPath = PathUtil.getImgBasePath() + targetAddr;
File dirPath = new File(realFileParentPath);
//File类对象的exists()方法用于判断一个目录是否存在
if(!dirPath.exists()) {
dirPath.mkdirs();
}
}
/**
* 获取输入文件流的拓展名(.jpg )
* @param
* @return
*/
private static String getFileExtension(MultipartFile thumbnail) {
String originalFilename = thumbnail.getName();
//String originalFilename = thumbnail.getOriginalFilename();
return originalFilename.substring(originalFilename.lastIndexOf("."));
}
/**
* private体现封装性,static在本类中省略this直接通过方法名调用
* 生成文件的随机名,当前时间yyyyMMddHHmmss格式+五位随机数
* @return
*/
private static String getRandomFileName(){
// 获取随机的五位数
int rannum = R5.nextInt(89999) + 10000;
String nowTimeStr = S_DATE_FORMAT.format(new Date());
return nowTimeStr + rannum;
}
//主函数的入口
// public static void main(String[] args) throws IOException {
// //获取当前线程的基础路径
// //String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
// //类的静态方法和链式编程
// Thumbnails.of(new File("F:\\javaweb\\taotao-upload\\images\\真是悠哉啊.jpg"))
// .size(1280, 720).watermark(Positions.BOTTOM_RIGHT,
// ImageIO.read(new File(basePath + "/watermark.jpg")),
// 0.25f).outputQuality(0.8f)
// .toFile("F:\\javaweb\\taotao-upload\\images\\真是悠哉啊new.jpg");
// }
}
================================================================================
附录:参考资料