开发喵星球

若依实现图片上传时自动添加水印(404)

为了解决图盗用,并有效保护图片版权,若依项目需要实现一个功能:上传图片时,自动在图片上添加水印。这不仅可以有效防止盗用,还能提高内容的安全性。本文将详细介绍如何在若依项目中实现图片上传时自动添加水印的功能。

总体思路

  1. 修改通用上传方法:在现有的上传图片功能中,添加步骤,将上传的图片添加水印。
  2. 处理文件路径:去除上传文件路径中的前两级目录,确保文件存储路径一致。
  3. 添加水印功能:使用 Graphics2D 绘制水印,并保存修改后的图片。

1. 修改通用上传方法

CommonController.java 中,我们需要修改文件上传逻辑。通过将上传的图片路径传递到水印添加方法,并返回水印处理后的图片 URL。

/**
 * 上传文件并添加水印(单个文件)
 */
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) throws Exception {
    try {
        // 获取文件上传路径
        String filePath = RuoYiConfig.getUploadPath();

        // 上传文件,并返回新文件名
        String fileName = FileUploadUtils.upload(filePath, file);

        // 去除文件路径的前两级目录
        String updatedFilePath = removePath(fileName);

        // 添加水印到图片
        String watermarkFilePath = addWatermark(filePath + updatedFilePath);

        // 构建访问上传后文件的URL
        String url = serverConfig.getUrl() + watermarkFilePath;

        // 返回响应结果
        AjaxResult ajax = AjaxResult.success();
        ajax.put("url", url);
        ajax.put("fileName", fileName);
        ajax.put("newFileName", FileUtils.getName(fileName));
        ajax.put("originalFilename", file.getOriginalFilename());
        return ajax;
    } catch (Exception e) {
        return AjaxResult.error("上传失败: " + e.getMessage());
    }
}

2. 去除文件路径前两级目录

为了确保上传的文件路径没有多余的目录,我们需要创建一个方法来去除路径的前两级目录。

/**
 * 去除文件路径的前两级目录
 */
private String removePath(String filePath) {
    int count = 0;
    int index = -1;
    // 查找第三个斜杠位置
    for (int i = 0; i < filePath.length(); i++) {
        if (filePath.charAt(i) == '/') {
            count++;
            if (count == 3) {
                index = i;
                break;
            }
        }
    }
    // 返回第三个斜杠之后的路径部分
    if (index != -1) {
        return filePath.substring(index);
    }
    return filePath;
}

3. 添加水印方法

接下来,我们实现添加水印的功能。在 Graphics2D 类中,我们可以绘制文本水印。以下是如何在图片上添加水印的代码:

/**
 * 给图片添加水印
 */
private String addWatermark(String filePath) throws IOException {
    // 读取图片文件
    BufferedImage image = ImageIO.read(new File(filePath));

    // 创建Graphics2D对象,设置水印的字体和样式
    Graphics2D g2d = (Graphics2D) image.getGraphics();
    Font font = new Font("宋体", Font.BOLD, 30);  // 设置字体、样式和大小
    g2d.setFont(font);
    g2d.setColor(new Color(255, 0, 0, 100)); // 红色透明水印

    // 水印内容
    String watermarkText = "kaifamiao专属水印";

    // 水印位置:右下角
    int x = image.getWidth() - g2d.getFontMetrics().stringWidth(watermarkText) - 10;
    int y = image.getHeight() - 10;

    // 绘制水印
    g2d.drawString(watermarkText, x, y);

    // 保存水印处理后的图片,覆盖原文件
    File output = new File(filePath);
    ImageIO.write(image, "jpg", output);

    // 释放Graphics2D资源
    g2d.dispose();

    return filePath;
}

运行效果

一旦集成了水印添加功能,当用户上传图片时,系统将自动在图片的右下角添加水印。以下是上传并添加水印后的效果示例:

图片水印效果

上传成功后,返回带水印的图片 URL,用户可以通过该 URL 访问带有水印的图片。

总结

通过以上步骤,我们成功地为若依项目实现了图片上传时自动添加水印的功能。这不仅保护了图片的版权,还增强了图片内容的安全性。通过 Graphics2D 类的绘图功能,我们可以灵活地在图片上添加自定义水印,进一步提升了项目的功能性和用户体验。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-11-29 19:25:50 阅读量:41
<<   >>


powered by kaifamiao