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

对象存储OSS工具类

css 复制代码
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;

    }

}
相关推荐
罗曼蒂克在消亡17 分钟前
GraphQL规范
开发语言·graphql
HealthScience20 分钟前
怎么将bash(sh)的所有输出保存到log/txt中?
开发语言·bash
Word码1 小时前
数据结构:栈和队列
c语言·开发语言·数据结构·经验分享·笔记·算法
五花肉村长1 小时前
数据结构-队列
c语言·开发语言·数据结构·算法·visualstudio·编辑器
秋落风声1 小时前
【数据结构】---图
java·数据结构··graph
萧鼎1 小时前
Python常见问题解答:从基础到进阶
开发语言·python·ajax
2401_857622661 小时前
Spring Boot新闻推荐系统:性能优化策略
java·spring boot·后端
C1 小时前
C++_智能指针详解
开发语言·c++
想躺平的做题家1 小时前
Linux高级编程_29_信号
开发语言·c·信号
qinzechen1 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#