当前位置: 首页 > news >正文

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进行图片格式转换

上次用laravel进行了一些s3得整合&#xff0c;可以看出来其实蛮简单得。 先导包 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId></dependency> 然后在配置类中写bean private static final String …...

Windows 10无法远程桌面连接:原因及解决方案

在信息技术日益发展的今天&#xff0c;远程桌面连接已成为企业日常运维、技术支持乃至个人用户远程办公的必备工具。然而&#xff0c;有时我们可能会遇到Windows 10无法远程桌面连接的问题&#xff0c;这无疑会给我们的工作和生活带来诸多不便。 原因分析 1、远程访问未启用&a…...

图神经网络实战(10)——归纳学习

图神经网络实战&#xff08;10&#xff09;——归纳学习 0. 前言1. 转导学习与归纳学习2. 蛋白质相互作用数据集3. 构建 GraphSAGE 模型实现归纳学习小结系列链接 0. 前言 归纳学习 (Inductive learning) 通过基于已观测训练数据&#xff0c;建立一个通用模型&#xff0c;使模…...

Python——IO编程

IO在计算机中指Input/Output&#xff0c;也就是输入和输出。由于程序和运行时数据是在内存中驻留&#xff0c;由CPU这个超快的计算核心来执行&#xff0c;涉及到数据交换的地方&#xff0c;通常是磁盘、网络等&#xff0c;就需要IO接口。 比如你打开浏览器&#xff0c;访问新浪…...

什么是网络端口?为什么会有高危端口?

一、什么是网络端口&#xff1f; 网络技术中的端口默认指的是TCP/IP协议中的服务端口&#xff0c;一共有0-65535个端口&#xff0c;比如我们最常见的端口是80端口默认访问网站的端口就是80&#xff0c;你直接在浏览器打开&#xff0c;会发现浏览器默认把80去掉&#xff0c;就是…...

CleanMyMac X v4.14.6中文破解版,让您的电脑像新的一样

小编给您带来CleanMyMac X v4.14.6中文破解版&#xff0c;CleanMyMac X破解版是应用在MacOS上的一款Mac系统清理优化工具&#xff0c;使用cleanmymac x 中文破解版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。 CleanMyMa…...

LeetCode 235. 二叉搜索树的最近公共祖先

LeetCode 235. 二叉搜索树的最近公共祖先 1、题目 题目链接&#xff1a;235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表…...

基于ASN.1的RSA算法公私钥存储格式解读

1.概述 RFC5958主要定义非对称密钥的封装语法&#xff0c;RFC5958用于替代RFC5208。非对称算法会涉及到1对公私钥&#xff0c;例如按照RSA算法&#xff0c;公钥是n和e&#xff0c;私钥是d和n。当需要将公私钥保存到文件时&#xff0c;需按照一定的格式保存。本文主要定义公私钥…...

RS2227XN功能和参数介绍及PDF资料

RS2227XN是一款模拟开关/多路复用器 品牌: RUNIC(润石) 封装: MSOP-10 描述: USB2.0高速模拟开关 开关电路: 双刀双掷(DPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通电阻(RonVCC): 10Ω 功能&#xff1a;模拟开关/多路复用器 USB2.0高速模拟开关 工作电压范围&#xff1a;1.8V ~ 5…...

机器人非线性阻抗控制系统

机器人非线性控制系统本质上是一个复杂的控制系统&#xff0c;其状态变量和输出变量相对于输入变量的运动特性不能用线性关系来描述。这种系统的形成基于两类原因&#xff1a;一是被控系统中包含有不能忽略的非线性因素&#xff0c;二是为提高控制性能或简化控制系统结构而人为…...

pandas style添加表格边框,或是只添加下边框等自定义边框样式设置

添加表格边框 可以使用如下程序添加表格&#xff1a; import dataframe_image as dfi import pandas as pd import numpy as npdf pd.DataFrame(np.random.random(size(10, 5))) df_style df.style.set_properties(**{text-align: center,border-color: black,border-width…...

OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

市面上关于终端&#xff08;手机&#xff09;操作系统在 3GPP 协议开发的内容太少了&#xff0c;即使 Android 相关的学习文档都很少&#xff0c;Android 协议开发书籍我是没有见过的。可能是市场需求的缘故吧&#xff0c;现在市场上还是前后端软件开发从业人员最多&#xff0c…...

windows部署腾讯tmagic-editor02-Runtime

创建editor项目 将上一教程中的hello-world复制过来&#xff0c;改名hello-editor 创建runtime项目 和hello-editor同级 pnpm create vite删除src/components/HelloWorld.vue 按钮需要用的ts types依赖 pnpm add tmagic/schema tmagic/stage实现runtime 将hello-editor中…...

“分块”算法的基本要素及 build() 函数的构建细节

【“分块”算法知识点】 ● 分块是用线段树的分区思想改良的暴力法。代码比线段树简单。效率比普通暴力法高。分块适合求解 m=n=10^5 规模的问题,或 m*sqrt(n)≈10^7 的问题。其中,n 为元素个数,m 为操作次数。 ● “分块”算法的基本要素 (1)块的大小用 block 表示。通常…...

畅捷通TPlus keyEdit.aspx、KeyInfoList.aspx SQL注入漏洞复现

前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、产…...

Ubuntu22 下配置 Qt5 环境

1. Qt 简介 Qt5 中的新功能&#xff0c;可以看到各个版本的情况Whats New in Qt 5 | Qt 5.15 Qt 源文件网址Index of /archive/qt 2. 安装 Qt Creator cd 到安装包所在目录&#xff0c;进行软件安装。赋予可执行权限&#xff0c;加上 sudo 权限进入安装&#xff0c;这样会安…...

普通人也能创业!轻资产短视频带货项目,引领普通人实现创业梦想

在这个信息爆炸的时代&#xff0c;创业似乎成为了越来越多人的梦想。然而&#xff0c;传统的创业模式 keJ0277 往往伴随着高昂的资金投入和复杂的管理流程&#xff0c;让许多普通人望而却步。然而&#xff0c;现在有一种轻资产短视频带货项目正在悄然兴起&#xff0c;它以其低…...

【Maven】Nexus简单使用

1、安装配置介绍Nexus私服&#xff1a; 安装配置指路上一篇详细教程博客 【Maven】Nexus私服简介_下载安装_登录-CSDN博客 简单介绍原有仓库类型&#xff1a; proxy代理仓库&#xff1a;代理远程仓库&#xff0c;访问全球中央仓库或其他公共仓库&#xff0c;将资源存储在私…...

winform嵌入excel 设置父窗体分辨率不是100% 嵌入excel分辨率变成双倍大小

在WinForms应用程序中嵌入Excel时&#xff0c;遇到分辨率问题可能是由于DPI缩放导致的。Windows 10及更高版本默认启用了DPI缩放&#xff0c;以便在高分辨率显示器上显示更清晰的内容。这可能会导致嵌入的应用程序&#xff08;如Excel&#xff09;看起来变大或变小。 解决方案 …...

前端系列-4 promise与async/await与fetch/axios使用方式

背景&#xff1a; 本文介绍promise使用方式&#xff0c;以及以Promise为基础的async/await用法和fetch/axios使用方式&#xff0c;主要以案例的方式进行。 1.promise 1.1 promise介绍 javascript是单线程执行的&#xff0c;异步编程的本质是事件机制和函数回调。当执行阻塞…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...