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

文章目录

  • 总体思路
    1. 修改通用上传方法
    1. 去除文件路径前两级目录
    1. 添加水印方法
  • 运行效果
  • 总结

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

总体思路

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

1. 修改通用上传方法

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

java 复制代码
/**
 * 上传文件并添加水印(单个文件)
 */
@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. 去除文件路径前两级目录

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

java 复制代码
/**
 * 去除文件路径的前两级目录
 */
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 类中,我们可以绘制文本水印。以下是如何在图片上添加水印的代码:

java 复制代码
/**
 * 给图片添加水印
 */
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 = "测试水印";
    
    // 水印位置:右下角
    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 类的绘图功能,我们可以灵活地在图片上添加自定义水印,进一步提升了项目的功能性和用户体验。

相关推荐
胡耀超10 天前
解读若依微服务架构图:架构总览、核心模块解析、消息与任务处理、数据存储与缓存、监控与日志
微服务·云原生·架构·若依
想要打 Acm 的小周同学呀12 天前
若依框架--数据字典设计使用和前后端代码分析
java·vue3·数据字典·若依
胡耀超13 天前
解读若依框架中的 @Xss 注解
xss·若依
胡耀超13 天前
解读若依框架中的`@Excel` 和 `@Excels` 注解
java·excel·若依
bjzhang7518 天前
若依使用 Undertow 替代 Tomcat 容器
tomcat·若依·undertow
bjzhang7525 天前
若依整合 Gitee 登录
gitee·若依
代码拯救不了世界1 个月前
若依框架中的上传图片后如何实现回显到页面的
java·图片上传·若依
bjzhang751 个月前
若依微服务如何获取用户登录信息
若依
bjzhang751 个月前
若依启动项目时配置为 HTTPS 协议
https·若依
duansamve1 个月前
如何快速搭建若依管理系统?
若依