4-3 Thumbnailator图片处理和封装Util【通过java代码实现判断不同操作系统运行环境与截取上传文件的拓展名】

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");    
//    }   
    
}

================================================================================

附录:参考资料

通过java代码实现给图片打上水印

发布了95 篇原创文章 · 获赞 20 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_40993412/article/details/103047846