【springboot】java文本字符串生成缩略图封面上传oss

前言

需要根据自定义内容绘制图片

一、java图片绘制布局缩略图并上传oss

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;

public class ThumbnailGenerator {

    // 你的OSS配置信息
    private static final String accessKeyId = "your_accessKeyId";
    private static final String accessKeySecret = "your_accessKeySecret";
    private static final String endpoint = "your_endpoint";
    private static final String bucketName = "your_bucketName";

    /**
     * 生成图像缩略图
     *
     * @param htmlOrText    要生成缩略图的文本或html字符串或富文本
     * @param thumbnailSize 缩略图大小
     * @return 生成的缩略图文件名
     */
    public static String generateThumbnail(String htmlOrText, int thumbnailSize) throws IOException {
        // 创建临时文件
        File tempFile = File.createTempFile("thumbnail", ".jpg");
        // 生成缩略图
        BufferedImage thumbnailImage = createThumbnailImage(htmlOrText, thumbnailSize);
        // 写入缩略图到临时文件
        ImageIO.write(thumbnailImage, "jpg", tempFile);
        // 上传缩略图到OSS
        String thumbnailFileName = uploadToOSS(tempFile);
        // 删除临时文件
        tempFile.delete();
        // 返回缩略图文件名
        return thumbnailFileName;
    }

    /**
     * 创建缩略图图像
     *
     * @param htmlOrText    要生成缩略图的文本或html字符串或富文本
     * @param thumbnailSize 缩略图大小
     * @return 生成的缩略图图像
     */
    private static BufferedImage createThumbnailImage(String htmlOrText, int thumbnailSize) throws IOException {
        // 创建图像缓冲区
        BufferedImage image = new BufferedImage(thumbnailSize, thumbnailSize, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = image.createGraphics();
        // 设置背景颜色
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, image.getWidth(), image.getHeight());
        // 创建字体
        Font font = new Font("Arial", Font.BOLD, thumbnailSize / 3);
        graphics.setFont(font);
        // 在缩略图中绘制文本或html字符串或富文本
        drawString(htmlOrText, graphics, thumbnailSize);
        // 释放资源
        graphics.dispose();
        // 返回生成的缩略图图像
        return image;
    }

    /**
     * 在缩略图中绘制文本或html字符串或富文本
     *
     * @param htmlOrText 要绘制的文本或html字符串或富文本
     * @param graphics   缩略图绘图对象
     * @param thumbnailSize 缩略图大小
     */
    private static void drawString(String htmlOrText, Graphics2D graphics, int thumbnailSize) {
        FontMetrics metrics = graphics.getFontMetrics();

        // 将文本或html字符串或富文本分段
        String[] lines = htmlOrText.split("\n");

        // 计算每行文本的位置
        int lineHeight = metrics.getHeight();
        int y = (thumbnailSize - (lines.length * lineHeight)) / 2;

        // 遍历每行文本,并在缩略图中绘制
        for (String line : lines) {
            int lineWidth = metrics.stringWidth(line);
            int x = (thumbnailSize - lineWidth) / 2;
            graphics.drawString(line, x, y + metrics.getAscent());
            y += lineHeight;
        }
    }

    /**
     * 上传缩略图到OSS
     *
     * @param file 要上传的文件
     * @return 上传后的文件名
     */
    private static String uploadToOSS(File file) throws IOException {
        // 创建OSS客户端
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            // 上传文件到OSS
            InputStream inputStream = new FileInputStream(file);
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.length());
            String fileName = "thumbnail-" + System.currentTimeMillis() + ".jpg";
            ossClient.putObject(bucketName, fileName, inputStream, metadata);
            return fileName;
        } finally {
            // 关闭OSS客户端
            ossClient.shutdown();
        }
    }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 Spring Boot 和阿里云 OSS Java SDK 实现断点上传并显示上传进度的示例代码: ```java import com.aliyun.oss.*; import com.aliyun.oss.model.UploadFileRequest; import com.aliyun.oss.model.UploadFileResult; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @Service public class OSSService { // 阿里云 OSS 客户端 private final OSS ossClient; // 构造函数注入 OSS 客户端对象 @Autowired public OSSService(OSS ossClient) { this.ossClient = ossClient; } /** * 断点上传文件到 OSS * * @param file 要上传的文件 * @param bucket 存储空间名称 * @param object 存储对象名称 * @param progress 上传进度回调函数 * @throws IOException */ public void uploadFileToOSS(MultipartFile file, String bucket, String object, ProgressCallback progress) throws IOException { // 创建 UploadFileRequest 对象 UploadFileRequest uploadFileRequest = new UploadFileRequest(bucket, object); // 设置要上传的文件 File localFile = File.createTempFile("temp", null); file.transferTo(localFile); uploadFileRequest.setUploadFile(localFile.getAbsolutePath()); // 创建 ResumableUploader 对象 ResumableUploader uploader = new ResumableUploader(ossClient, uploadFileRequest); // 设置上传进度回调函数 uploader.setProgressCallback(progress); // 开始上传文件 UploadFileResult result = uploader.upload(); // 删除本地临时文件 localFile.delete(); // 打印上传结果 System.out.println("ETag: " + result.getETag()); System.out.println("RequestId: " + result.getRequestId()); } } ``` 在上述代码中,我们定义了一个名为 `uploadFileToOSS` 的方法,该方法接收要上传的文件、存储空间名称、存储对象名称和上传进度回调函数作为参数。在方法内部,我们首先创建 `UploadFileRequest` 对象,并设置要上传的文件。然后,我们创建 `ResumableUploader` 对象,并设置上传进度回调函数。最后,我们调用 `upload` 方法开始上传文件。 上传进度回调函数的实现如下: ```java import com.aliyun.oss.event.ProgressEvent; import com.aliyun.oss.event.ProgressEventType; import com.aliyun.oss.event.ProgressListener; public class OSSProgressCallback implements ProgressListener { private final long totalSize; public OSSProgressCallback(long totalSize) { this.totalSize = totalSize; } @Override public void progressChanged(ProgressEvent event) { if (event.getEventType() == ProgressEventType.REQUEST_BYTE_TRANSFER_EVENT) { long bytesWritten = event.getBytes(); System.out.println("Uploaded " + bytesWritten + " bytes of " + totalSize + " bytes"); } } } ``` 在上述代码中,我们定义了一个名为 `OSSProgressCallback` 的类,该类实现了 `ProgressListener` 接口。在 `progressChanged` 方法中,我们判断事件类型是否为 `REQUEST_BYTE_TRANSFER_EVENT`,如果是,则表示已上传的字节数发生了变化,我们就可以计算出当前上传进度并输出。 在 Spring Boot 控制器中调用 `uploadFileToOSS` 方法,并传入上传进度回调函数: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @RestController public class OSSController { private final OSSService ossService; @Autowired public OSSController(OSSService ossService) { this.ossService = ossService; } @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { String bucketName = "<yourBucketName>"; String objectName = "<yourObjectName>"; // 计算文件大小 long fileSize = file.getSize(); // 创建上传进度回调函数 ProgressCallback progressCallback = new OSSProgressCallback(fileSize); // 上传文件到 OSS ossService.uploadFileToOSS(file, bucketName, objectName, progressCallback); return "File uploaded successfully!"; } } ``` 需要注意的是,这里需要先注入一个阿里云 OSS 客户端对象,示例代码中使用了构造函数注入的方式。另外,需要替换代码中的 `bucketName` 和 `objectName` 参数为自己阿里云账号的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值