2024 JAVA Tinypng压缩图片,超级简单!!!

一、打开官网,注册账号,获取秘钥(每个月500张免费)

1.打开官网,注册账号

TinyPNG – Compress WebP, PNG and JPEG images intelligently

2.登录后,点击账号名字,找到如图所示

3.找到API,就看到一串秘钥,后续工具类的API_KEY换成它 

二、API手册

三、导入依赖,和配置文件

         <dependency><groupId>com.tinify</groupId><artifactId>tinify</artifactId><version>RELEASE</version></dependency>

#oss
oss.endpoint:oss-cn-自己的.com
oss.accessKeyId:自己的
oss.accessKeySecret:自己的
oss.bucketName:自己的
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

四、上传oss工具类

 @Configuration
public class AliOssUtil {@Value("${oss.endpoint}")private String endpoint;// accessKey@Value("${oss.accessKeyId}")private String accessKeyId;@Value("${oss.accessKeySecret}")private String accessKeySecret;// 空间@Value("${oss.bucketName}")private String bucketName;private OSS ossClient;//Tinify的API密钥private static String API_KEY = "自己的APIKEY";/*** 初始化*/@PostConstructpublic void init() {ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);}/*** tiny压缩图片后上传到oss** @param file* @return*/public String compressImage1(MultipartFile file) {try {// 设置Tinify的API密钥Tinify.setKey(API_KEY);// 从MultipartFile创建Tinify的Source对象Source source = Tinify.fromBuffer(file.getBytes());// 压缩图片source.toFile(file.getOriginalFilename());// 返回压缩后的图片数据byte[] bytes = Files.readAllBytes(Paths.get(file.getOriginalFilename()));// 上传到ossMultipartFile file1 = convertToMultipartFile(bytes, file.getOriginalFilename());String url = uploadObject2OSS(file1);return url;} catch (Exception e) {e.printStackTrace();return null;}}/*** tiny自定义图片大小后上传到oss** @param file* @return*/public String compressImage2(MultipartFile file) {try {// 设置Tinify的API密钥Tinify.setKey(API_KEY);// 从MultipartFile创建Tinify的Source对象Source source = Tinify.fromBuffer(file.getBytes());// 自定义图片大小Options options = new Options().with("method", "fit").with("width", 100).with("height", 100);Source resized = source.resize(options);resized.toFile(file.getOriginalFilename());// 返回压缩后的图片数据byte[] bytes = Files.readAllBytes(Paths.get(file.getOriginalFilename()));// 上传到ossMultipartFile file1 = convertToMultipartFile(bytes, file.getOriginalFilename());String url = uploadObject2OSS(file1);return url;} catch (Exception e) {e.printStackTrace();return null;}}/*** 向阿里云的OSS存储中存储文件  --file也可以用InputStream替代** @param file 上传文件* @return String 唯一MD5数字签名*/public String uploadObject2OSS(MultipartFile file) {String resultStr = null;try {// 创建上传Object的MetadataObjectMetadata metadata = new ObjectMetadata();metadata.setContentLength(file.getInputStream().available());metadata.setCacheControl("no-cache");metadata.setHeader("Pragma", "no-cache");metadata.setContentEncoding("utf-8");metadata.setContentType(file.getContentType());String fileName = file.getOriginalFilename();String date = new DateTime().toString("yyyy/MM-dd");String filePath = "自定义名字/" + date + "/" + RandomStringUtils.randomNumeric(6) + fileName;PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, filePath, file.getInputStream(), metadata);ossClient.putObject(putObjectRequest);// 关闭resultStr = "https://" + bucketName + "." + endpoint + "/" + filePath;} catch (Exception e) {e.printStackTrace();System.out.println("上传阿里云OSS服务器异常." + e.getMessage() + e);}return resultStr;}/*** 二进制转为MultipartFile** @param data* @param filename* @return*/public static MultipartFile convertToMultipartFile(byte[] data, String filename) {ByteArrayResource resource = new ByteArrayResource(data) {@Overridepublic String getFilename() {return filename;}};return new MultipartFile() {@Overridepublic String getName() {return filename;}@Overridepublic String getOriginalFilename() {return filename;}@Overridepublic String getContentType() {return MediaType.APPLICATION_OCTET_STREAM_VALUE;}@Overridepublic boolean isEmpty() {return data.length == 0;}@Overridepublic long getSize() {return data.length;}@Overridepublic byte[] getBytes() {return data;}@Overridepublic InputStream getInputStream() {return new ByteArrayInputStream(data);}@Overridepublic void transferTo(File dest) throws IOException, IllegalStateException {new FileOutputStream(dest).write(data);}};}}

五、controller使用工具类


import com.xiaoqiu.gate2.utils.AliOssUtil;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;/*** 上传*/
@RestController
@RequestMapping("/test/upload")
public class UploadController {@Resourceprivate AliOssUtil aliOssUtil;/*** 上传图片** @param file* @return*/@PostMapping("/fileUpload")@ResponseBodypublic String upload(@RequestParam("file") MultipartFile file) {String url = aliOssUtil.compressImage(file);return url;}
}

六、调用接口测试,成功返回url

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/660289.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当众演讲技巧的方法有哪些(3篇)

当众演讲技巧的方法有哪些&#xff08;3篇&#xff09; 当众演讲技巧的方法有很多&#xff0c;下面我将分三篇来详细阐述其中的一些关键技巧&#xff1a; **篇&#xff1a;准备与开场技巧 充分准备&#xff1a;提前规划演讲内容&#xff0c;明确主题和目标&#xff0c;准备详…

螺旋角和导程、转位后的齿轮有什么关系?

最近和小伙伴聊到了一个问题&#xff1a;斜齿轮螺旋角和导程的关系&#xff0c;主要是在遇到在采用转位设计方式的刀具时&#xff0c;更觉得有点迷惑&#xff0c;今天咱们就聊聊这个事儿。 先来说斜齿轮螺旋角和导程的关系&#xff1a; 斜齿轮是有多个螺旋面组成的&#xff0…

解决RTC内核驱动的问题bm8563

常用pcf-8563 , 国产平替BM8563(驱动管脚一致)&#xff1b; 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟&#xff0c;可以使用专用的实时时钟芯片来完成此功能 RTC 设备驱动是一个标准…

【证明】快慢指针在带环链表中是否存在无法相遇的情形

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1. 前言2. 证明过程2.1 证明2.2 加证 3. 结论4. 结语 1. 前言 在了解本次内容前&#xff…

牛客热题:判断链表是否有环

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;判断链表是否有环题目链接方法一…

ansible-playbook离线升级centos内核

目录 概述实践ansible目录结构关键代码执行效果 结束 概述 内核离线包官网下载地址如下&#xff1a; 地址 实践 ansible目录结构 如对 ansible 不熟悉&#xff0c;离线包下载有问题&#xff0c;请至此地址下载&#xff0c;按本文操作可直接使用。 相关文章链接如下 文章地…

普乐蛙元宇宙VR体验馆设备集体亮相VR文旅景区展

普乐蛙全国巡展又双叒叕开始了! 这次来到的是“好客山东”↓↓ 山东2024休闲旅游产业展 4月25日至27日&#xff0c;2024休闲旅游产业展在临沂国际博览中心举办。本次展会以“潮购文旅好品&#xff0c;乐享时尚生活”为主题&#xff0c;汇聚全国文旅产业上下游500多家企业、上万…

深度学习系列66:试穿模型IDM-VTON上手

1. 模型概述 如图&#xff0c;总体流程为&#xff1a; 输入为&#xff1a;衣服的编码xg&#xff1b;人物noise的编码xt&#xff1b;人物身上衣物的mask和人体pose分割(densepose)&#xff1b;衣服部分经过两部分网络&#xff1a;1&#xff09;高级语义网络IP-Adapter&#xff…

anything-llm的嵌入式聊天小部件

anything-llm 详情移步到官方: https://github.com/Mintplex-Labs/anything-llm anything-llm可以docker启动和本地启动 例如&#xff1a;docker 启动&#xff0c; 自行去安装docker哈 cd 到docker文件夹下&#xff0c; 窗口运行&#xff1a; docker-compose up -d --build运…

简要说说软分叉和硬分叉。

前言 一、软分叉 二、硬分叉 三、用途 总结 前言 软分叉和硬分叉是区块链技术中的两个重要概念&#xff0c;它们通常与加密货币的网络升级有关。下面我将分别解释这两个概念&#xff0c;并提供一些例子来帮助理解。下面是方便理解软分叉和硬分叉的图 一、软分叉 软分叉是一…

有没有永久免费的仓库出入库管理软件

作为相关行业的从业者&#xff0c;很多中小企业希望能节省成本&#xff0c;或者没有付费使用管理系统的习惯&#xff0c;所以想要找到一款永久免费的仓库出入库管理软件。但我还是不大建议大家选择所谓的免费仓库管理软件。为什么呢&#xff1f;请往下看 很多时候免费的才是最…

渗透测试之sql注入绕过技巧

在sql注入中&#xff0c;通常会将某些关键的字符过滤掉&#xff0c;以此来达到预防sql注入的目的。这时我们就可以通过某些技巧来绕过。 绕过技巧1&#xff1a; 这个是在某个比赛中出现的&#xff0c;当时并没有多少人成功绕过。 如下&#xff1a; 如下图&#xff1a;在php中…