在若依项目中实现上传图片时自动添加水印功能,以保护图片版权和防止盗用。
Graphics2D
是 Java
中用于绘图的高级图形类,属于 java.awt
包。它是 Graphics 类的子类,提供了更丰富的绘图功能和更高的灵活性。Graphics2D
可以用于绘制形状、文本和图像,并支持高级图形操作如变换、剪切、和抗锯齿等。
ruoyi
├── ruoyi-admin
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ └── ruoyi
│ │ │ │ └── web
│ │ │ │ └── controller
│ │ │ │ └── common
│ │ │ │ └── CommonController.java
│ │ │ └── resources
│ │ └── test
├── ruoyi-framework
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
└── pom.xml
在ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.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());
}
}
在CommonController.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;
}
在CommonController.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, 20);
g2d.setFont(font);
g2d.setColor(Color.BLACK);
// 在右下角添加水印
String watermark = "kaifamiao专属水印";
int x = image.getWidth() - g2d.getFontMetrics().stringWidth(watermark) - 10;
int y = image.getHeight() - 10;
g2d.drawString(watermark, x, y);
// 保存添加水印后的图片,覆盖原始图片
File output = new File(filePath);
ImageIO.write(image, "jpg", output);
g2d.dispose();
return filePath;
}
上传图片时,系统自动在图片右下角添加水印文字“kaifamiao专属水印”。上传成功后,返回包含水印的图片的URL,用户可以通过该URL访问带有水印的图片。
powered by kaifamiao