腾讯云OSS文件上传功能

腾讯云COS介绍

腾讯云COS(Cloud Object Storage)是一种基于对象的存储服务,用于存储和管理海量的非结构化数据,如图片、音视频文件、备份数据等。它具有以下特点和优势:

  1. 高可靠性:采用分布式存储架构,数据会在多个设备上进行冗余备份,确保数据的高可靠性和持久性。
  2. 弹性扩展:支持根据业务需求自动扩展存储容量,无需担心存储空间不足的问题。
  3. 低成本:提供按需计费方式,用户只需支付实际使用的存储容量和数据传输流量,无需预付费。
  4. 安全性:支持数据加密传输和存储,保障数据的安全性和隐私性。
  5. 简单易用:提供简单的API接口和丰富的SDK,方便开发者快速集成和使用。

此外,腾讯云COS还广泛应用于以下场景:

  1. 静态网站托管:将网站的静态资源(如HTML、CSS、JavaScript、图片等)存储在COS中,实现高可用、高性能的静态网站托管。
  2. 大规模数据备份和归档:提供高可靠性和低成本的存储服务,适用于大规模数据备份和长期归档存储。
  3. 音视频存储和处理:支持存储和管理大规模的音视频文件,并提供音视频处理服务,如转码、截图、水印等。
  4. 移动应用数据存储:提供简单易用的API和SDK,方便移动应用将用户数据、图片、文件等存储在云端。
  5. 云原生应用存储:可以作为云原生应用的对象存储服务,存储应用程序的配置文件、日志文件、静态资源等。

总的来说,腾讯云COS是一种高可靠、低成本、弹性扩展的云存储服务,适用于各种需要存储和管理海量非结构化数据的场景。

一、前言

后台管理系统需要有图片等文字上传功能,如图。

通过腾讯的OSS组件进行文件的上传。

二、实现步骤

1、pom文件引入腾讯云cos  maven依赖

		<dependency>
			<groupId>com.qcloud</groupId>
			<artifactId>cos_api</artifactId>
			<version>${cos_api.version}</version>
		</dependency>

版本可使用:  <cos_api.version>5.6.89</cos_api.version>

2、编写配置类。获取cos的相关配置,

相关配置包括域名、地域节点,存储桶 ,秘钥等购买腾讯云时分配的信息。与及要上传的文件相关信息要求。

@Data
@Component
@ConfigurationProperties(prefix = "oss.tencent")
public class TencentProperties {
	
    /**域名*/
    private String domain;
    /**地域节点*/
    private String region;
    /**存储桶名称*/
    private String bucketName;
    /**secretId*/
    private String secretId;
    /**secretKey*/
    private String secretKey;
    /**图片策略*/
    private String styleRule;
    /**缩略图策略*/
    private String thumbnailStyleRule;
    /**文件类型*/
    private List<String> fileTypes;
}

3、文件上传下载处理类编写

@Slf4j
@Component("tencent")
public class TencentFileHandle implements FileStrategy {

    @Autowired
    TencentProperties tencentProperties;


    // 创建 COSClient 实例,这个实例用来后续调用请求
    COSClient createCOSClient() {
        // 设置用户身份信息。
        // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
        String secretId = tencentProperties.getSecretId();
        String secretKey = tencentProperties.getSecretKey();
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

        // ClientConfig 中包含了后续请求 COS 的客户端设置:
        ClientConfig clientConfig = new ClientConfig();

        // 设置 bucket 的地域
        // COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224
        clientConfig.setRegion(new Region(tencentProperties.getRegion()));

        // 设置请求协议, http 或者 https
        // 5.6.53 及更低的版本,建议设置使用 https 协议
        // 5.6.54 及更高版本,默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);

        // 以下的设置,是可选的:

        // 设置 socket 读取超时,默认 30s
        clientConfig.setSocketTimeout(30*1000);
        // 设置建立连接超时,默认 30s
        clientConfig.setConnectionTimeout(30*1000);

        // 如果需要的话,设置 http 代理,ip 以及 port
//        clientConfig.setHttpProxyIp("httpProxyIp");
//        clientConfig.setHttpProxyPort(80);

        // 生成 cos 客户端。
        return new COSClient(cred, clientConfig);
    }

    // 创建 TransferManager 实例,这个实例用来后续调用高级接口
    TransferManager createTransferManager() {
        // 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。
        // 详细代码参见本页: 简单操作 -> 创建 COSClient
        COSClient cosClient = createCOSClient();

        // 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源
        // 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。
        ExecutorService threadPool = Executors.newFixedThreadPool(32);

        // 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。
        TransferManager transferManager = new TransferManager(cosClient, threadPool);

        // 设置高级接口的配置项
        // 分块上传阈值和分块大小分别为 5MB 和 1MB
        TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
        transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);
        transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);
        transferManager.setConfiguration(transferManagerConfiguration);

        return transferManager;
    }

    void shutdownTransferManager(TransferManager transferManager) {
        // 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。
        // 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。
        transferManager.shutdownNow(true);
    }

    @Override
    public UploadDto upload(MultipartFile file) throws Exception {
        return upload(file, null);
    }

    @Override
    public UploadDto upload(MultipartFile file, String filePath) throws Exception {
        //文件名
        String fileFullName = FileUtil.getName(file.getOriginalFilename());
        InputStream inputStream = file.getInputStream();
        return upload(inputStream, fileFullName, filePath);
    }

    public UploadDto upload(InputStream inputStream, String fileFullName, String filePath) throws Exception {
        if (inputStream == null) {
            throw new Exception("上传文件不能为空");
        }
        TransferManager transferManager = createTransferManager();
        String bucketName = tencentProperties.getBucketName();

        //int inputStreamLength = 1024 * 1024;
//        byte data[] = new byte[inputStreamLength];
//        InputStream inputStream = new ByteArrayInputStream(data);

        ObjectMetadata objectMetadata = new ObjectMetadata();
        // 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length
        // 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了
        //objectMetadata.setContentLength(inputStreamLength);
        try {
            //时间戳
            String timestamp = String.valueOf(System.currentTimeMillis());
            //文件扩展名
             String extension = FileUtil.getSuffix(fileFullName);
            String fileName = FileUtil.getPrefix(fileFullName);
            List<String> fileTypes = tencentProperties.getFileTypes();
            if(fileTypes != null) {
                boolean flag= fileTypes.contains(extension);
                Assert.isTrue(flag, "不支持上传的文件类型:" + extension);
            }
            String upFilePath = StringUtils.join(fileName, "_", timestamp, ".", extension);
            if(filePath != null) {
                upFilePath = StringUtils.join(filePath, "/", upFilePath);
            }
            String key = upFilePath;
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);
            // 高级接口会返回一个异步结果Upload
            // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常
            Upload upload = transferManager.upload(putObjectRequest);
            UploadResult uploadResult = upload.waitForUploadResult();
            if (uploadResult == null) {
                log.error("上传附件到腾讯云失败 fileName={}", upFilePath);
                throw new Exception("上传附件 " + upFilePath + " 到腾讯云失败 ");
            }

            log.info("cos fileName:" + upFilePath);
            //返回上传结果
            UploadDto uploadDto = new UploadDto();
            uploadDto.setName(upFilePath);
//            uploadDto.setKey(upFilePath);
            uploadDto.setCreateTime(DateUtil.date());
            return uploadDto;
        } catch (Exception e) {
            log.error("cos 上传失败", e);
            throw new RuntimeException("文件="+fileFullName + " 上传失败");
        } finally {
            shutdownTransferManager(transferManager);
        }
    }

    @Override
    public byte[] download(String key) throws Exception {
        return null;
    }


    @Override
    public void delete(String key) {

    }

}

4、图片相关信息类

@Data
public class UploadDto implements Serializable {
	
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**图片名*/
    private String name;
    /**图片路径*/
    private String imgUrl;
//    /**key*/
//    private String key;
//    /**图片跳转路径*/
//    private String targetUrl;
    /**上传日期*/
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createTime;
}

5、调用

/**
     * 图片上传
     * 图片上传至OSS
     *
     * @param file 文件流
     * @return ResponseData<UploadDto>
     * @throws Exception
     */
    @ApiOperation(value = "图片上传至OSS", notes = "图片上传至OSS")
    @PostMapping("upload")
    public ResponseData<UploadDto> upload(@RequestPart("file") MultipartFile file, @RequestHeader(name="ossType") String ossType) throws Exception {
//        Assert.notNull(ossType, "资源类型不能为空");
        if (file.getSize()/1024 > 10*1024) {
            return ResponseData.error("资源为:" + (file.getSize()/1024/1024) + "M,大小超出限制的10M");
        }

        OssTypeEnum ossTypeEnum = null;
        try {
            if(ossType != null)
                ossTypeEnum = OssTypeEnum.valueOf(ossType);
        } catch (RuntimeException e) {
            return ResponseData.error("资源类型不存在:" + ossType);
        }
        //上传至OSS
        UploadDto dto = uploadService.upload(file, ossTypeEnum);
        if (ObjectUtil.isNotEmpty(dto)) {
            return ResponseData.success(dto);
        } else {
            log.error(MShuffleConstant.UPLOAD_FAILED);
            return ResponseData.error(MShuffleConstant.UPLOAD_FAILED);
        }
    }

相关配置说明:

腾讯云COS(Cloud Object Storage)的配置主要涉及到创建存储桶、设置访问权限、配置数据传输等方面。以下是一个基本的腾讯云COS配置说明:

  1. 创建存储桶:首先,你需要在腾讯云COS控制台中创建一个或多个存储桶,用于存储你的数据。存储桶是COS中用于存储对象的容器,你可以根据业务需求创建不同的存储桶来组织和管理你的数据。
  2. 设置访问权限:为了保护你的数据安全,你需要为存储桶设置适当的访问权限。COS提供了多种访问权限控制方式,包括基于身份的访问控制(IAM)、存储桶策略、预签名URL等。你可以根据实际需求选择适合的权限控制方式,确保只有授权的用户或应用程序能够访问你的数据。
  3. 配置数据传输:如果你的数据需要从其他地方传输到COS,你可以配置数据传输任务。COS支持多种数据传输方式,包括使用COS的迁移工具、通过API接口上传数据、使用SDK进行数据传输等。你可以根据你的数据来源和目标选择适合的数据传输方式。
  4. 启用数据处理功能:COS还提供了一些数据处理功能,如图片处理、音视频处理等。如果你需要对这些类型的数据进行处理,可以在COS控制台中启用相应的处理功能,并配置相应的处理规则。

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

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

相关文章

什么是485远程水表?

485远程水表是一种利用RS485通信协议进行数据传输的智能水表&#xff0c;它具有远程读数、实时监控、数据存储等功能&#xff0c;为水资源管理和居民用水提供了便捷。在我国&#xff0c;随着物联网、大数据等技术的发展&#xff0c;485远程水表得到了广泛的应用&#xff0c;为智…

数据库索引面试的相关问题

查看索引的执行计划 索引失效的情况 1、索引列上做了计算&#xff0c;函数&#xff0c;类型转换等操作。索引失效是因为查询过程需要扫描整个索引并回表。代价高于直接全表扫描。 Like匹配使用了前缀匹配符“%abc” 字符串不加引号导致类型转换。 原因&#xff1a; 常见索…

Java Thread 线程安全问题 上锁 解锁

模拟问题 package com.zhong.thread.usethread;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;/*** ClassName : ThreadProject* Description : 线程安全问题小案例* Author : zhx* Date: 2024-02-19 13:21*/ public class ThreadPr…

postman也不行!IDEA接口调试插件

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

树和堆的精讲

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

MySQL的基础架构

文章目录 前言MySQL的基础架构总结 前言 你使用 MySQL 开发&#xff0c;你知道 MySQL 的基础架构吗&#xff1f;本文带你来入门MySQL 的基础架构 MySQL的基础架构 MySQL 是我们经常使用到的数据库。它的基础架构分为 server 层与存储引擎层。 server 层&#xff1a;用于存储…

nacos 2.3.1-SNAPSHOT 源码springboot方式启动(详细)附改造工程地址

文章时间是2024-2-18日&#xff0c;nacos默认develop分支&#xff0c;最新版是2.3.1-SNAPSHOT版本。 我们这里就以nacos最新版进行改造成springboot启动方式。 1. Clone 代码 nacos github地址&#xff1a;https://github.com/alibaba/nacos.git 根据上面git地址把源码克隆到…

oauth2 授权码模式 流程说明和接口整理

一、说明 oauth2 授权模式一共有四种&#xff0c;即隐式授权模式、授权码授权模式、密码授权模式和客户端授权模式。 这里仅对授权码授权模式所包含的流程和接口做说明和整理。 具体的概念和源码解读&#xff0c;资料有很多&#xff0c;可以自行去搜索学习。 二、流程说明 假…

OpenAI最新模型Sora到底有多强?眼见为实的真实世界即将成为过去!

文章目录 1. 写在前面2. 什么是Sora&#xff1f;3. Sora的技术原理 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感…

maptalks多边形区域和点位-vue组件

多边形 <!-- 地图组件 --> <template><div :id="id" class="container"></div> </template><script> import _ from "lodash"; import "maptalks/dist/maptalks.css"; import * as maptalks from…

Open CASCADE学习|用点分割边

在Open CASCADE Technology&#xff08;OCCT&#xff09;中&#xff0c;几何模型是由拓扑&#xff08;Topology&#xff09;和几何&#xff08;Geometry&#xff09;两部分组成的。拓扑部分描述了形状的拓扑结构&#xff0c;比如边、面、体等&#xff0c;而几何部分则定义了这些…

金蝶云星空——用递归SQL查询物料分组

应用场景&#xff1a; 金蝶物料分组为树形结构&#xff0c;需要根据SQL查询同步到第三方系统中。 技术实现 用递归CTE按照树状结构展开物料分组 with cte as( select 0 as 物料分组层级,t1.FID,case when isnull(t1.FFULLPARENTID,) then .CAST(t1.FID AS VARCHAR(…

裸辞5个月,面试了37家公司,终于找到理想工作了

上半年裁员&#xff0c;下半年裸辞&#xff0c;有不少人高呼裸辞后躺平真的好快乐&#xff01;但也有很多人&#xff0c;裸辞后的生活五味杂陈。 面试37次终于找到心仪工作 因为工作压力大、领导PUA等各种原因&#xff0c;今年2月下旬我从一家互联网小厂裸辞&#xff0c;没想…

LeetCode JS专栏刷题笔记(二)

一、前言 LeetCode - JavaScript 专栏刷题笔记第二篇。 第一篇刷题笔记详见&#xff1a;LeetCode JS专栏刷题笔记&#xff08;一&#xff09; 二、算法题目 1. 复合函数 LeetCode地址&#xff1a;2629. 复合函数 请你编写一个函数&#xff0c;它接收一个函数数组 [f1, f2, …

(2024,自级联扩散,关键点引导的噪声重新调度,时间感知特征上采样器)进行廉价的扩展:用于更高分辨率适应的自级联扩散模型

Make a Cheap Scaling: A Self-Cascade Diffusion Model for Higher-Resolution Adaptation 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 4. 自级联扩散模型 …

【数据结构与算法】手搓JDK底层ArrayList底层 - 动态数组

数组 在介绍数组之前&#xff0c;我们先来看一段chatGPT给出的对于数组描述&#xff1a; 数组&#xff08;Array&#xff09;是一种线性数据结构&#xff0c;它由一组连续的内存空间组成&#xff0c;用来存储相同类型的数据元素。数组具有固定的大小&#xff0c;一旦创建后&a…

【Docker】前后端分离项目 Gin+Vue 容器化部署 | docker-compose 部署 | 部署 nginx 通过域名访问

文章目录 前言前后端不完全独立docker 部署mysqlredisrbac docker compose 部署部署 nginx 前后端独立部署 前言 项目地址&#xff1a;https://gitee.com/Cauchy_AQ/rbac 项目前端使用 vue3 并且由 vite 构建&#xff0c;后端采用 gin 框架&#xff0c;搭建了一个简易的权限管…

计算机设计大赛 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

WildCard:一个因太好用而被迫暂停服务的虚拟信用卡平台,魅力何在?

如果你需要使用Wildcard开通GPT4、Midjourney或是Only方式的话&#xff0c;请点击&#xff1a;WildCard使用教程 参考文章链接&#xff1a;WildCard&#xff1a;一个因太好用而被迫暂停服务的虚拟信用卡平台&#xff0c;魅力何在&#xff1f; 1、Wildcard用户数量激增&#x…

lombok的Getter, Setter报错 cannot find symbol

今天突然发现项目里的lombok失效了&#xff0c;get , set全部报错 java: cannot find symbol 觉得很奇怪&#xff0c;年前放假前都好好的&#xff0c;没改过代码&#xff0c;依赖&#xff0c;注解都正确&#xff0c;突然报这个错。 后来才发现是因为重装过系统&#xff0c;id…