JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

SpringBoot 实现对上传的图片添加时间戳、上传信息等内容?

wys521 2024-11-25 10:57:09 精选教程 26 ℃ 0 评论

#长文创作激励计划#

接到了老板的这样一个需求,要对上传的图片文件添加上当前上传的时间戳以及上传者的信息等内容,这可真的是难住我了,我又不是专业做图片处理的,如何能够实现这样的一个需求呢?下面我们就来一起看看如何在SpringBoot文件上传的过程中实现对于图片添加上传时间上传者信息的功能吧。

引入依赖配置

在POM文件中引入相关的依赖配置,如下所示。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

接下来就是需要在配置文件中添加上文件上传路径,如下所示。

file.upload-dir=uploads/

实现文件上传功能

既然是要在文件上传的过程中对图片进行处理,那么首先需要实现的就应该是一个文件上传的功能,如下所示。

@RestController
@RequestMapping("/api")
public class FileUploadController {

    @Value("${file.upload-dir}")
    private String uploadDir;

    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file,
                                             @RequestParam("uploader") String uploader) {
        try {
            // 创建上传目录
            Files.createDirectories(Paths.get(uploadDir));

            // 获取文件名和上传路径
            String fileName = file.getOriginalFilename();
            Path filePath = Paths.get(uploadDir, fileName);

            // 保存文件到磁盘
            Files.write(filePath, file.getBytes());

            // 添加时间戳和上传者信息
            addWatermark(filePath.toString(), uploader);

            return ResponseEntity.ok("File uploaded successfully: " + fileName);
        } catch (IOException e) {
            return ResponseEntity.status(500).body("Failed to upload file: " + e.getMessage());
        }
    }

    private void addWatermark(String filePath, String uploader) {
        // 在这里添加处理图片的代码,添加时间戳和上传者信息
        // 使用 Java 图形处理库,例如 BufferedImage 和 Graphics2D
    }
}

接下来我们就来看看在addWatermark方法中如何对图片进行处理,添加上时间戳以及文件上传者的信息。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;

private void addWatermark(String filePath, String uploader) {
    try {
        File imageFile = new File(filePath);
        BufferedImage image = ImageIO.read(imageFile);

        Graphics2D g2d = (Graphics2D) image.getGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // 设置字体和颜色
        g2d.setFont(new Font("Arial", Font.BOLD, 30));
        g2d.setColor(Color.RED);

        // 获取当前时间
        String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

        // 添加时间戳和上传者信息
        String watermarkText = "Uploaded by: " + uploader + " at " + timeStamp;
        g2d.drawString(watermarkText, 10, image.getHeight() - 10);

        g2d.dispose();

        // 保存新的图片
        ImageIO.write(image, "jpg", new File(filePath));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在这个方法中我们通过BufferedImage和Graphics2D来处理图片,并且添加时间戳和上传者信息。

如何调整水印位置

这样我们就实现了一个上传图片并且添加时间戳信息的功能,但是实际上老板要的功能是要让时间戳信息和上传者的信息显示到图片的右下角,这该如何是好呢?

根据上面的需求,我们需要修改addWatermark方法,使得水印信息添加到图片的右下角,这就需要我们计算水印文本的宽高并且将其添加到右下角合适的位置。如下所示。

import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;

private void addWatermark(String filePath, String uploader) {
    try {
        File imageFile = new File(filePath);
        BufferedImage image = ImageIO.read(imageFile);

        Graphics2D g2d = (Graphics2D) image.getGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // 设置字体和颜色
        Font font = new Font("Arial", Font.BOLD, 30);
        g2d.setFont(font);
        g2d.setColor(Color.RED);

        // 获取当前时间
        String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

        // 添加时间戳和上传者信息
        String watermarkText = "Uploaded by: " + uploader + " at " + timeStamp;

        // 获取文本的尺寸
        FontRenderContext frc = g2d.getFontRenderContext();
        GlyphVector gv = font.createGlyphVector(frc, watermarkText);
        Rectangle bounds = gv.getPixelBounds(frc, 0, 0);
        int textWidth = bounds.width;
        int textHeight = bounds.height;

        // 计算文本位置(右下角,离边界有一定距离)
        int x = image.getWidth() - textWidth - 10;
        int y = image.getHeight() - textHeight - 10;

        // 绘制文本
        g2d.drawString(watermarkText, x, y + textHeight);

        g2d.dispose();

        // 保存新的图片
        ImageIO.write(image, "jpg", new File(filePath));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这样我们就实现了对于图片水印操作放到右下角的操作。下面我们给出完整的实现逻辑代码。完整的代码实现了文件上传以及上传之后调用添加水印的方法的操作。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.http.ResponseEntity;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;

@RestController
@RequestMapping("/api")
public class FileUploadController {

    @Value("${file.upload-dir}")
    private String uploadDir;

    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file,
                                             @RequestParam("uploader") String uploader) {
        try {
            // 创建上传目录
            Files.createDirectories(Paths.get(uploadDir));

            // 获取文件名和上传路径
            String fileName = file.getOriginalFilename();
            Path filePath = Paths.get(uploadDir, fileName);

            // 保存文件到磁盘
            Files.write(filePath, file.getBytes());

            // 添加时间戳和上传者信息
            addWatermark(filePath.toString(), uploader);

            return ResponseEntity.ok("File uploaded successfully: " + fileName);
        } catch (IOException e) {
            return ResponseEntity.status(500).body("Failed to upload file: " + e.getMessage());
        }
    }

    private void addWatermark(String filePath, String uploader) {
        try {
            File imageFile = new File(filePath);
            BufferedImage image = ImageIO.read(imageFile);

            Graphics2D g2d = (Graphics2D) image.getGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            // 设置字体和颜色
            Font font = new Font("Arial", Font.BOLD, 30);
            g2d.setFont(font);
            g2d.setColor(Color.RED);

            // 获取当前时间
            String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

            // 添加时间戳和上传者信息
            String watermarkText = "Uploaded by: " + uploader + " at " + timeStamp;

            // 获取文本的尺寸
            FontRenderContext frc = g2d.getFontRenderContext();
            GlyphVector gv = font.createGlyphVector(frc, watermarkText);
            Rectangle bounds = gv.getPixelBounds(frc, 0, 0);
            int textWidth = bounds.width;
            int textHeight = bounds.height;

            // 计算文本位置(右下角,离边界有一定距离)
            int x = image.getWidth() - textWidth - 10;
            int y = image.getHeight() - textHeight - 10;

            // 绘制文本
            g2d.drawString(watermarkText, x, y + textHeight);

            g2d.dispose();

            // 保存新的图片
            ImageIO.write(image, "jpg", new File(filePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表