springboot整合s3,用ImageIO进行图片格式转换

2024-05-09 16:04

本文主要是介绍springboot整合s3,用ImageIO进行图片格式转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上次用laravel进行了一些s3得整合,可以看出来其实蛮简单得。

先导包

        <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId></dependency>

然后在配置类中写bean

    private static final String AK = "xxxxxxxxxxxx";private static final String SK = "xxxxxxxxxxxx";@Beanpublic S3Client s3Client() {return S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(AK, SK))).region(Region.US_WEST_2).build();}

然后就可以用注解拿到s3client了,直接开始写接口

Controller

    @ApiOperation("上传文件")@PostMapping("/upload")public Response upload(@RequestParam("file") MultipartFile file) {if (StringUtils.isBlank(file.getOriginalFilename())) {return Response.fail(RespCode.FILE_NAME_IS_EMPTY);}if (file.getSize() == 0L) {return Response.fail(RespCode.FILE_IS_EMPTY);}if (file.getSize() > FILE_MAX_BYTE) {return Response.fail(RespCode.FILE_TOO_LARGE);}return SingleResponse.ok(s3Service.upload(file));}

Service

@Service
public class S3Service {@Autowiredprivate S3Client s3Client;public static final String BUCKET_NAME = "xxxxxxxx";public static final String URL = "xxxxxxxxxx";public String upload(MultipartFile multipartFile) {String tmpPath = StringUtils.join(System.getProperties().getProperty("java.io.tmpdir"), "/");String fileSuf = null;int index = multipartFile.getOriginalFilename().lastIndexOf(".");if (index > -1) {fileSuf = multipartFile.getOriginalFilename().substring(index);}File file = new File(tmpPath + UUIDUtils.lowerCaseNoSeparatorUUID() + fileSuf);try {multipartFile.transferTo(file);file.deleteOnExit();} catch (IOException e) {throw new SvcException(e.getMessage());}return upload(file);}public String upload(File file) {PutObjectRequest putOb = PutObjectRequest.builder().bucket(BUCKET_NAME).key(file.getName()).build();s3Client.putObject(putOb, RequestBody.fromFile(file));return StringUtils.join(URL, file.getName());}}
String tmpPath = StringUtils.join(System.getProperties().getProperty("java.io.tmpdir"), "/");这一句根据你不同得web容器可能会有不一样得效果,一般是tomcat没什么大毛病,但是我这次用的undertow ,就有一点小坑。如果大家也是用undertow ,大家可以看看这个博客自己解决

spring boot文件上传、undertow 临时文件配置、NoSuchFileException: /tmp/under、IOException: No space left on device_springboot上传文件临时文件清理-CSDN博客

至此,s3基本上传功能是没问题了。

但是我想要改装一下,把图片格式都变成jpg,我使用的是java得imageIO类来处理。先把第一个upload改装一下

    public String upload(MultipartFile multipartFile) {String tmpPath = StringUtils.join(System.getProperties().getProperty("java.io.tmpdir"), "/");String fileSuf = null;int index = multipartFile.getOriginalFilename().lastIndexOf(".");if (index > -1) {fileSuf = ".jpg"; // 将所有上传的图片统一转换为 JPG 格式}File file = new File(tmpPath + UUIDUtils.lowerCaseNoSeparatorUUID() + fileSuf);try {multipartFile.transferTo(file);file.deleteOnExit();// 转换上传的图片为 JPG 格式String outputImagePath = tmpPath + UUIDUtils.lowerCaseNoSeparatorUUID() + ".jpg";ImageConverterUtils.convertToJPG(file.getAbsolutePath(), outputImagePath);// 调用自己的 upload 方法处理图片上传return upload(new File(outputImagePath));} catch (IOException e) {throw new SvcException(e.getMessage());}}

我自己写了个很简单得工具类

public class ImageConverterUtils {public static void convertToJPG(String sourceImage,String outputImage) throws IOException {File source = new File(sourceImage);BufferedImage bufferedImage = ImageIO.read(source);File output = new File(outputImage);ImageIO.write(bufferedImage,"jpg",output);}
}

到这里确实可以把一些图片转换成jpg并且上传到s3,不过依旧有坑。

第一个就是其实imageIO貌似不支持webp格式得转换,一次webp格式得图片总数会转换不成功

很好解决,添加个pom依赖就好:

        <dependency><groupId>org.sejda.imageio</groupId><artifactId>webp-imageio</artifactId><version>0.1.6</version></dependency>

第二,不仅不支持webp,而且png也会出毛病。我的毛病是只要是png格式的,ImageIO.write居然返回false,抛出异常了。原因是ImageIO.wite方法在中调用的私有方法getWriter寻找合适的ImageWriter时不仅与formatName相关,还是输入的原图有关,造成getWriter方法找不到对应的ImageWriter。

因此改造成了一下我的工具类:

public class ImageConverterUtils {public static void convertToJPG(String sourceImage,String outputImage) throws IOException {File source = new File(sourceImage);BufferedImage bufferedImage = ImageIO.read(source);BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(),bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);Graphics2D g = newBufferedImage.createGraphics();g.drawImage(bufferedImage, 0, 0,null);File output = new File(outputImage);ImageIO.write(newBufferedImage,"jpg",output);g.dispose();}
}

然后就没问题了,可以正常上传和转换格式了。

这里顺带有个蛮好用的网站,可以看到文件的MIME类型:MIME File Type Checker - HTMLStrip

 

java : 调用ImageIO.writer从BufferedImage生成jpeg图像的坑-CSDN博客

[ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南 - 知乎 (zhihu.com)

这篇关于springboot整合s3,用ImageIO进行图片格式转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973844

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J