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

devtools/2024/9/23 17:25:35/

一、打开官网,注册账号,获取秘钥(每个月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.ppmy.cn/devtools/22806.html

相关文章

idea的插件,反编译整个jar包

idea的插件&#xff0c;反编译整个jar包 1.安装插件1.1找到插件1.2 搜索插件 2.反编译整个jar包2.1 复制jar包到工件目录下&#xff1a;2.2 选中jar包&#xff0c;点出右键 3.不用插件&#xff0c;手动查看某一个java类3.1 选中jar包&#xff0c;点出右键 1.安装插件 1.1找到插…

【计算机网络】成功解决 ARP项添加失败:请求的操作需要提升

最近在用Wireshark做实验时候&#xff0c;需要清空本机ARP表和DNS缓存&#xff0c;所以在cmd窗口输入以下命令&#xff0c; 结果发生了错误&#xff1a;ARP项添加失败&#xff1a;请求的操作需要提升 一开始我还以为是操作的命令升级了&#xff0c;但是后面发现其实只是给的权…

NLP transformers - 文本分类

Text classification 文章目录 Text classification加载 IMDb 数据集Preprocess 预处理EvaluateTrainInference 本文翻译自&#xff1a;Text classification https://huggingface.co/docs/transformers/tasks/sequence_classification notebook : https://colab.research.googl…

web server apache tomcat11-27-Security Considerations

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

Linxu系统服务管理,systemd知识/进程优先级/平均负载/php进程CPU100%怎么解决系列知识!

shell脚本&#xff08;命令&#xff09;放后台 sleep 300& 放到后台运行&#xff0c;脚本或命令要全路径 nohup&#xff1a;用户推出系统进程继续工作 【功能说明】 nohup 命令可以将程序以忽略挂起信号的方式运行起来&#xff0c;被运行程序的输出信息将不会显示到终端 如…

VoxAtnNet:三维点云卷积神经网络

VoxAtnNet:三维点云卷积神经网络 摘要IntroductionProposed VoxAtnNet 3D Face PAD3D face point cloud presentation attack Dataset (3D-PCPA) VoxAtnNet: A 3D Point Clouds Convolutional Neural Network for 摘要 面部生物识别是智能手机确保可靠和可信任认证的重要组件。…

ai智能机器人语音后端识别处理呼叫系统部署

人工智能是推动科技跨越发展、产业优化升级、生产力整体跃升的重要战略资源。随着一系列支持人工智能发展政策的相继落地&#xff0c;相关产业的创新活力也被日益激发&#xff0c;推动现有商业体系内各个产业加速变革。在人工智能领域&#xff0c;电话机器人落地的速度也在加快…

【排序算法】第一章:插入排序----直接插入排序与希尔排序的详解和对比

&#x1fae1;和我一起感受 两种排序算法的魅力吧&#xff01; 前言&#xff1a; 理解排序算法最好的方法就是&#xff1a;先单趟后整体 先从一个元素的一趟开始理解再扩展到所有元素的排序 一、直接插入排序 理解排序算法最好的方法就是&#xff1a;先单趟后整体 插入排序&a…