JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类

在这里插入图片描述

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.model.ciModel.persistence.PicOperations;
import com.qcloud.cos.region.Region;
import com.wangyao.common.config.TencentOssConfig;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;


@Slf4j
public class CosUtil {

    private static final TencentOssConfig CONFIG;

    private static final String RULE_STR = "imageMogr2/format/webp";

    private static final String EXT = "^(jpg|jpeg|png|gif)$";
    public static final int INT = 1024;


    static {
        CONFIG = SpringUtil.getBean(TencentOssConfig.class);
    }

    @NotNull
    private static COSClient createCosClient() {
        COSCredentials cred = new BasicCOSCredentials(CONFIG.getSecretId(), CONFIG.getSecretKey());
        ClientConfig clientConfig = new ClientConfig();
        clientConfig.setRegion(new Region(CONFIG.getRegion()));
        return new COSClient(cred, clientConfig);
    }

    /**
     * 上传OSS 自定义 Key
     *
     * @param inputStream 文件流
     * @param key         key
     * @return String
     */
    @SuppressWarnings("unused")
    public static String upOssByKey(InputStream inputStream, String key, String fileName) {
        return upOssByKey(inputStream, key, CONFIG.getBucket(), fileName);
    }

    /**
     * 上传OSS 自定义 Key
     *
     * @param inputStream 文件流
     * @param key         key
     * @param bucket      桶名
     * @return String
     */
    public static String upOssByKey(InputStream inputStream, String key, String bucket, String fileName) {
        return upOss(inputStream, null, key, bucket, fileName);
    }

    /**
     * 上传OSS
     *
     * @param inputStream 文件流
     * @param keyPrefix   key前缀
     * @return String
     */
    @NotNull
    public static String upOss(InputStream inputStream, String keyPrefix, String fileName) {
        return upOss(inputStream, keyPrefix, CONFIG.getBucket(), fileName);
    }

    /**
     * 上传OSS
     *
     * @param file      文件
     * @param keyPrefix key前缀
     * @return String
     */
    public static String upOss(MultipartFile file, String keyPrefix, String fileName) {
        return upOss(file, keyPrefix, null, CONFIG.getBucket(), fileName);
    }

    /**
     * 上传OSS
     *
     * @param inputStream 文件流
     * @param keyPrefix   key前缀
     * @param bucket      桶名
     * @return String
     */
    public static String upOss(InputStream inputStream, String keyPrefix, String bucket, String fileName) {
        return upOss(inputStream, keyPrefix, null, bucket, fileName);
    }

    @NotNull
    @SuppressWarnings("unused")
    public static String upOssKey(InputStream inputStream, String keyPrefix, String key, String fileName) {
        return upOss(inputStream, keyPrefix, key, CONFIG.getBucket(), fileName);
    }

    /**
     * 上传网络图片到OSS
     * @param url 网络路径
     * @return String
     */
    public static String upOss(String url, String keyPrefix, String fileName) {

        try {
            SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE);

            try (CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(scsf).build();) {
                HttpGet httpget = new HttpGet(url);
                HttpResponse response = client.execute(httpget);
                return upOss(response.getEntity().getContent(), keyPrefix, CONFIG.getBucket(), fileName);
            }

        } catch (Exception e) {
            log.error("上传网络图片到OSS失败:", e);
        }

        return null;

    }

    private static String upOss(InputStream inputStream, String keyPrefix, String key, String bucket, @NotNull String fileName) {

        var cosClient = createCosClient();

        var compressPath = "https://455.cos.ap-beijing.myqcloud.com/";

        key = getString(keyPrefix, key, fileName);
        log.info("key={}", key);
        String type = fileName.substring(fileName.lastIndexOf(".") + 1);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(type);

        try {
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, key, inputStream, objectMetadata);
            if (type.toLowerCase().matches(EXT)) {
                extracted(bucket, fileName, putObjectRequest);
            }
            PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
            String eTag = putObjectResult.getETag();
            log.info("eTag = {}", eTag);
            cosClient.shutdown();
        } catch (Exception e) {
            log.error("Cos Upload Failed. ", e);
        }

        String result = compressPath + key;
        log.info("Cos Upload Path: {}", result);
        return result;

    }

    private static String getString(String keyPrefix, String key, String fileName) {
        if (StringUtils.isBlank(key)) {
            key = StringUtils.isNotBlank(keyPrefix) ? keyPrefix + fileName : fileName;
        }
        return key;
    }

    private static void extracted(String bucket, String fileName, PutObjectRequest putObjectRequest) {
        //如果图片比较大就进行压缩。否则就直接上传
        PicOperations picOperations = new PicOperations();
        // 添加图片处理规则
        List<PicOperations.Rule> ruleList = new LinkedList<>();
        PicOperations.Rule rule = new PicOperations.Rule();
        rule.setBucket(bucket);
        rule.setFileId(fileName);
        rule.setRule(RULE_STR);
        ruleList.add(rule);
        picOperations.setRules(ruleList);
        putObjectRequest.setPicOperations(picOperations);
    }

    @SuppressWarnings("all")

    private static String upOss(@NotNull MultipartFile file, String keyPrefix, String key, String bucket, String fileName) {

        COSClient cosClient = createCosClient();

        String compressPath = "https://455.cos.ap-beijing.myqcloud.com/";

        key = getString(keyPrefix, key, fileName);
        log.info("key={}", key);
        String type = fileName.substring(fileName.lastIndexOf(".") + 1);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(type);

        try {
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, key, file.getInputStream(), objectMetadata);
            if (type.toLowerCase().matches(EXT)) {
                //如果图片比较大就进行压缩。否则就直接上传
                if (file.getSize() > INT * INT) {
                    extracted(bucket, fileName, putObjectRequest);
                }
            }
            PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
            String eTag = putObjectResult.getETag();
            log.info("eTag = {}", eTag);
            cosClient.shutdown();
        } catch (Exception e) {
            log.error("Cos Upload Failed. ", e);
        }

        String result = compressPath + key;
        log.info("Cos Upload Path: {}", result);
        return result;

    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

洗地机品牌哪个最好用?硬核推荐五大实力爆款洗地机

在这个忙碌的时代&#xff0c;家就是我们放松的港湾&#xff0c;但要保持它的清洁与舒适常常很不容易。每天拖着疲惫的身体回家&#xff0c;还要面对地板上那些难缠的灰尘、污渍&#xff0c;真是非常让人头疼。不过&#xff0c;洗地机的出现就像是给家务清洁装上了智能引擎&…

idea中maven全局配置

配置了就不需要每次创建项目都来设置maven仓库了。 1.先把项目全关了 2. 进入全局设置 3.设置maven的仓库就可以了

一篇文章带你完全理解C语言数组

文章目录 1.一维数组的创建和初始化数组的创建1.2数组的初始化1.3 一维数组的使用1.4一维数组在内存中的存储 2.二维数组的创建和初始化2.1二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用2.4 二维数组在内存中的存储 3.数组越界4.数组作为函数参数4.1 冒泡排序函数的错…

从零开始开发美颜SDK:打造属于平台的主播美颜工具

本篇文章&#xff0c;小编将从零开始&#xff0c;介绍如何打造一款属于平台的主播美颜工具。 一、需求分析 首先&#xff0c;明确开发美颜SDK的需求是至关重要的。当前市场上&#xff0c;美颜工具的功能主要包括&#xff1a; 1.实时美颜&#xff1a;磨皮、美白、瘦脸等基础功…

Static关键字的用法详解

Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可以用于多种上…

项目机会:4万平:智能仓,AGV,穿梭车,AMR,WMS,提升机,机器人……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 如下为近期国内智能仓储物流相关项目的公开信息线索&#xff0c;这些项目具体信息会发布到知识星球&#xff0c;请感兴趣的球友先人一步到知识星球【智能仓储物流技术研习社】自行下载…

时钟系统框图(时钟树)解析

时钟系统框图&#xff08;时钟树&#xff09;解析 文章目录 时钟系统框图&#xff08;时钟树&#xff09;解析1、时钟树2、 4个时钟源&#xff1a;$HSI、HSE、LSI、LSE$3、PLL锁相环倍频输出4、系统时钟的来源5、Enable CSS&#xff08;时钟监视系统&#xff09;6、几个重要的时…

微信开发者工具使用

1.下载微信开发者工具 https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html 2.下载小程序项目代码 3.用微信开发者工具导入项目代码 4.npm安装依赖 5.构建 6.修改测试环境 7.清除缓存 观察切换test后&#xff0c;登录时是否test字样提醒&#xff0c;若…

使用Python+OpenCV实现姿态估计--20240705

姿态估计使用Opencv+Mediapipe来时实现 什么是Mediapipe? Mediapipe是主要用于构建多模式音频,视频或任何时间序列数据的框架。借助MediaPipe框架,可以构建令人印象深刻的ML管道,例如TensorFlow,TFLite等推理模型以及媒体处理功能。 安装命令: pip install mediapipe如果…

大模型提示词工程和落地思考

本文是一篇内部的个人分享&#xff08;已无敏感信息&#xff09; &#xff0c;目的是增加产品、开发同学对 LLM 的理解&#xff0c;以降低沟通中的阻力&#xff0c;更好推进落地。 以下经脱敏后的原文: 大模型并不神奇 很多人听到’大模型’这个词可能会觉得很神秘&#xff…

centos7固定ip

1.查看虚拟网络配置 2.修改网卡配置文件 [jiajinglocalhost ~]$ su - Password: Last login: Thu Jul 4 19:06:16 PDT 2024 on pts/0 [rootlocalhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ON…

倘若你的的B端系统如此漂亮,还担心拿不出手吗,尤其是面对客户

如果你的B端系统设计如此漂亮&#xff0c;那么通常来说&#xff0c;你不太需要担心在客户那里拿不出手。一个漂亮和易用的设计可以提升用户体验&#xff0c;增加客户对系统的满意度。 然而&#xff0c;还是有一些因素需要考虑&#xff0c;以确保你的B端系统在客户那里能够得到良…

综合项目实战--jenkins流水线

一、流水线定义 软件生产环节,如:需求调研、需求设计、概要设计、详细设计、编码、单元测试、集成测试、系统测试、用户验收测试、交付等,这些流程就组成一条完整的流水线。脚本式流水线(pipeline)的出现代表企业人员可以更自由的通过代码来实现不同的工作流程。 二、pi…

【夏季跨境】7-9月热门类目选品指南(附自用选品工具免费插件)

一、夏季跨境热门类目及品类 1 、运动与户外 随着夏季的到来&#xff0c;户外活动变得更加频繁&#xff0c;运动和户外装备的需求显著上升 自行车配件 自行车部件&#xff1a;踏板、自行车配件存储、自行车灯、自行车手机支架 整车及相关配件&#xff1a;成人/儿童自行车、…

JavaEE——计算机工作原理

冯诺依曼体系&#xff08;VonNeumannArchitecture&#xff09; 现代计算机&#xff0c;大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算与逻辑判断 存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制存储&#xff09; 输入…

【python】OpenCV—Nighttime Low Illumination Image Enhancement

文章目录 1 背景介绍2 代码实现3 原理分析4 效果展示5 附录np.ndindexnumpy.ravelnumpy.argsortcv2.detailEnhancecv2.edgePreservingFilter 1 背景介绍 学习参考来自&#xff1a;OpenCV基础&#xff08;24&#xff09;改善夜间图像的照明 源码&#xff1a; 链接&#xff1a…

Golang 数组+切片+映射

数组 什么是数组 数组是一种数据类型&#xff0c;属于值类型数组可以存放多个同一类型数据 数组定义 var 数组名 [数组大小]数据类型 var a [5]int数组初始化的4种方式 var numArray01 [3]int [3]int{1,2,3} var numArray02 [3]int{1,2,3} var numArray03 [...]int{1,2…

直接更新flowable数据库的流程定义信息的一种方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

servlet学校会场预约系统-计算机毕业设计源码72972

摘要 学校会场预约是学校管理中的重要环节&#xff0c;但传统的手工预约方式存在效率低下和信息不准确等问题。为了提高预约效率和减少管理成本&#xff0c;许多学校开始采用基于Servlet技术的会场预约系统。本论文旨在设计和实现一种高效的Servlet学校会场预约系统&#xff0c…

Apache Flink架构介绍

目录 一、Apache Flink架构组件栈 1.1 概述 1.2 架构图 1.3 架构分层组件说明 1.3.1 物理部署层 1.3.2 Runtime 核心层 1.3.3 API & Libraries层 二、Flink运行时架构 2.1 概述 2.2 架构图 2.3 架构角色和组件 2.3.1 Flink Clients客户端 2.3.2 JobManager 2.…