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

news/2024/7/8 2:30:15 标签: java, 腾讯云, 开发语言

对象存储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.niftyadmin.cn/n/5536267.html

相关文章

Linux--V4L2应用程序开发(二)获取数据

一、采集数据流程 申请buffer用来放置摄像头数据 ioctl VIDIOC_REQBUFS&#xff1a;申请buffer&#xff0c;APP可以申请很多个buffer&#xff0c;但是驱动程序不一定能申请到 ioctl VIDIOC_QUERYBUF和mmap&#xff1a;查询buffer信息、映射 如果申请到了N个buffer&#xff0c…

边界无限陈佩文:红蓝对抗安全演练常态化的各方分析

虽然常态化演练尚未正式开始&#xff0c;但我们仍然希望对各方的表现进行一些分析和预测&#xff0c;以辅助我们对市场的判断和决策。同时&#xff0c;也希望通过这些初步的见解&#xff0c;抛砖引玉&#xff0c;引发更多有价值的讨论和观点。 “船停在码头是最安全的&#xf…

table = collections.defaultdict(list)申请的字典的类型是什么?

当你使用 collections.defaultdict(list) 来申请一个字典时&#xff0c;这个字典的类型是 defaultdict&#xff0c;但是其行为和表现方式在某些方面与普通的字典&#xff08;dict&#xff09;相似&#xff0c;主要区别在于它如何处理缺失的键。 defaultdict 是 Python 标准库 …

人工智能系列-numpy(一)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Numpy是python语言的一个拓展程序库&#xff0c;支持大量的维度数组与矩阵计算&#xff0c;此外也针对数组运算提供大量的数学函数库 NumPy支持的数据类型比Python内置的类型要…

金融科技在反洗钱领域的创新应用及案例

随着金融科技的迅猛发展&#xff0c;其在反洗钱领域的应用也日益广泛和深入。这些创新应用不仅提高了反洗钱工作的效率和准确性&#xff0c;还为金融机构应对日益复杂的洗钱活动提供了有力支持。下面将详细介绍一些金融科技在反洗钱领域的创新应用案例。 一、AI大模型与知识图谱…

同步时钟:北斗/GPS卫星、电信基站、NTP以太网校时方式的区别

同步时钟是保证各设备时间统一的重要装置&#xff0c;广泛应用于电力、通信、金融、学校、医院、地铁等多个领域。目前&#xff0c;常用的同步时钟方式包括&#xff1a;北斗/GPS卫星、电信基站、NTP以太网等。 下面跟着小编来看一下这些校时方式及他们的区别吧。 1. 北斗/GP…

Three.js机器人与星系动态场景(二):强化三维空间认识

在上篇博客中介绍了如何快速利用react搭建three.js平台&#xff0c;并实现3D模型的可视化。本文将在上一篇的基础上强化坐标系的概念。引入AxesHelper辅助工具及文本绘制工具&#xff0c;带你快速理解camer、坐标系、position、可视区域。 Three.js机器人与星系动态场景&#x…

GPT-5 一年半后发布?我们可能所受影响与应用领域

前言&#xff1a; IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。此外&#xff0c;穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述…