上传图片到云存储

news/2024/7/7 18:55:46

代码

@Service
public class AppUploadServiceImpl implements AppUploadService {

    @Value("${cos.secretId}")
    private String secretId;

    @Value("${cos.secretKey}")
    private String secretKey;

    @Value("${cos.region}")
    private String region;

    @Value("${cos.bucketName}")
    private String bucketName;

    /**
     * 上传
     * @param pics 需要上传的图片
     * @param scale 缩小比例
     * @param quality 压缩比例
     * @return
     * @throws IOException
     */
    @Override
    public List<String> upload(MultipartFile[] pics, float scale, double quality) throws IOException {

        // 检查图片是否符合要求
        if(pics == null || pics.length == 0){
            return new ArrayList<>();
        }

        List<String> paths = new ArrayList<>();
        for (MultipartFile pic : pics) {
            String type = FileTypeUtil.getType(pic.getInputStream());
            Assert.isTrue(!pic.isEmpty(), "图片错误");
            Assert.isTrue(Arrays.asList("png", "jpg", "jpeg").contains(type.toLowerCase()), "不支持图片类型");

            // 压缩图片
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            Img.from(pic.getInputStream())
                    .scale(scale)
                    .setQuality(quality)
                    .write(outputStream);

            // 上传到云存储
            String key = UUID.randomUUID().toString();
            String path = "image/" + key + "." + type;
            PutObjectRequest putObjectRequest = new PutObjectRequest(this.bucketName, path, new ByteArrayInputStream(outputStream.toByteArray()), null);
            getClient().putObject(putObjectRequest);

            // 组合获取图片访问链接
            String picPath = "https://" + this.bucketName + ".cos." + this.region + ".myqcloud.com/" + path;
            paths.add(picPath);
        }

        return paths;
    }

    private COSClient getClient(){

        String secretId = this.secretId;
        String secretKey = this.secretKey;

        BasicCOSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

        ClientConfig clientConfig = new ClientConfig();
        clientConfig.setRegion(new Region(this.region));
        clientConfig.setHttpProtocol(HttpProtocol.https);
        clientConfig.setSocketTimeout(30*1000);
        clientConfig.setConnectionRequestTimeout(30*1000);

        return new COSClient(cred, clientConfig);
    }
}

在这里插入图片描述

api

对象存储api文档:

https://cloud.tencent.com/document/product/436

获取存储桶的地址:

https://console.cloud.tencent.com/cos/bucket

获取密钥地址:

https://console.cloud.tencent.com/cam/capi

测试

在这里插入图片描述

在这里插入图片描述


http://lihuaxi.xjx100.cn/news/1887861.html

相关文章

HAT(CVPR 2023):Hybrid Attention Transformer for Image Restoration

HAT ​ 论文地址&#xff1a;HAT: Hybrid Attention Transformer for Image Restoration ​ 代码地址&#xff1a;XPixelGroup/HAT: CVPR2023 - Activating More Pixels in Image Super-Resolution Transformer 摘要 ​ 通过归因分析attribution analysis method - Local …

建筑学VR虚拟仿真情景实训教学

首先&#xff0c;建筑学VR虚拟仿真情景实训教学为建筑学专业的学生提供了一个身临其境的学习环境。通过使用VR仿真技术&#xff0c;学生可以在虚拟环境中观察和理解建筑结构、材料、设计以及施工等方面的知识。这种教学方法不仅能帮助学生更直观地理解复杂的建筑理论&#xff0…

【精选】SpringMVC简介及其执行流程,参数获取方式

SpringMVC简介 MVC模型 MVC全称Model View Controller&#xff0c;是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中&…

Unity中Shader语义的理解

前言 以下内容主要是个人理解&#xff0c;如有错误&#xff0c;欢迎严厉批评指正。 一、语义的形式在Shader中是必要的吗&#xff1f; 不是必要的。 使用HLSL和CG语言来编写Shader需要语义&#xff0c;使用GLSL编写Shader不需要。 二、语义的意义&#xff1f; 语义是什么&…

多线程 (上) - 学习笔记

前置知识 什么是线程和进程? 进程: 是程序的一次执行,一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff0c;比如在Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。 线程: 进程中的一个执行流&#xff0…

Llama2-Chinese-7b-Chat安装部署

文章目录 前言一、文件介绍 &#x1f4c1;二、环境配置 ♟三、Llama2-Chinese-7b-Chat下载 ⏬总结 前言 本文主要介绍如何使用Llama2-Chinese-7b-Chat&#xff0c;最后的效果如图所示&#xff1a; 一、文件介绍 &#x1f4c1; ⬇️ 下载地址&#xff1a;https://pan.baidu.…

(第23天)Oracle 数据泵用户导出导入

PS:有日子没写东西了,忙的屁股都找不到了,今天找到了,写一篇,没断更,对不住大家了… 数据泵用户的导出导入并不难,相信大家也都会,这里我主要讲一些大家可能不知道的细节和技巧,废话不多说,直接上干货! 数据库信息 角色主机名IP地址(导出/导入)用户密码源库lucife…

vue3 + ts 判断数据类型的各种方法集合

vue3 ts 判断数据类型的各种方法集合(记录ing…) 1. 直接上代码 1. 在utils文件夹下新建 index.ts// index.ts/*** description: 判断是否为某个类型*/ export function is(val: unknown, type: string) {return Object.prototype.toString.call(val) [object ${type}]; }/*…