腾讯云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 {@AutowiredTencentProperties 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/6224clientConfig.setRegion(new Region(tencentProperties.getRegion()));// 设置请求协议, http 或者 https// 5.6.53 及更低的版本,建议设置使用 https 协议// 5.6.54 及更高版本,默认使用了 httpsclientConfig.setHttpProtocol(HttpProtocol.https);// 以下的设置,是可选的:// 设置 socket 读取超时,默认 30sclientConfig.setSocketTimeout(30*1000);// 设置建立连接超时,默认 30sclientConfig.setConnectionTimeout(30*1000);// 如果需要的话,设置 http 代理,ip 以及 port
//        clientConfig.setHttpProxyIp("httpProxyIp");
//        clientConfig.setHttpProxyPort(80);// 生成 cos 客户端。return new COSClient(cred, clientConfig);}// 创建 TransferManager 实例,这个实例用来后续调用高级接口TransferManager createTransferManager() {// 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。// 详细代码参见本页: 简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源// 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。ExecutorService threadPool = Executors.newFixedThreadPool(32);// 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。TransferManager transferManager = new TransferManager(cosClient, threadPool);// 设置高级接口的配置项// 分块上传阈值和分块大小分别为 5MB 和 1MBTransferManagerConfiguration 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);}@Overridepublic UploadDto upload(MultipartFile file) throws Exception {return upload(file, null);}@Overridepublic 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);}}@Overridepublic byte[] download(String key) throws Exception {return null;}@Overridepublic 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);}//上传至OSSUploadDto 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控制台中启用相应的处理功能,并配置相应的处理规则。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin基本语法3集合

1.List集合 1.1 只读List fun main() {val list listOf("Jason", "Jack", "Jacky")println(list.getOrElse(3){"Unknown"})println(list.getOrNull(3)?:"Unknown") } 1.2 可变List fun main() {val mutableList mutabl…

MySQL的备份与恢复案例

新建数据库 数据库备份&#xff0c;数据库为school&#xff0c;素材如下1.创建student和score表CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address…

ubuntu22.04@laptop OpenCV Get Started: 010_blob_detection

ubuntu22.04laptop OpenCV Get Started: 010_blob_detection 1. 源由2. blob应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点分析3.1 Threshold3.2 Area3.3 Circularity3.4 Convexity3.5 Inertia Ratio 4. 总结5. 参考资料6. 补充 1. 源由 Blob是图像中的一组连接像素&#…

LiveGBS流媒体平台GB/T28181常见问题-基础配置流媒体服务配置中本地|内网IP外网IP(可选)外网IP收流如何配置

LiveGBS常见问题基础配置流媒体服务配置中本地|内网IP外网IP外网IP收流如何配置&#xff1f; 1、流媒体服务配置2、播放提示none rtp data receive3、多网卡服务器4、收流端口配置5、端口区间可以如何配置6、搭建GB28181视频直播平台 1、流媒体服务配置 LiveGBS中基础配置-》流…

Query Rewrite —— 基于大模型的query扩展改写,综合考虑上下文信息(人大论文)

在session上下文中&#xff0c;捕获用户的搜索意图&#xff0c;是一件较为复杂和困难的事情。 一起看一下人大的这篇论文 Large Language Models Know Your Contextual Search Intent: A Prompting Framework for Conversational Search 会话中的搜索意图和query改写 人大的论…

测试环境搭建整套大数据系统(三:搭建集群zookeeper,hdfs,mapreduce,yarn,hive)

一&#xff1a;搭建zk https://blog.csdn.net/weixin_43446246/article/details/123327143 二&#xff1a;搭建hadoop&#xff0c;yarn&#xff0c;mapreduce。 1. 安装hadoop。 sudo tar -zxvf hadoop-3.2.4.tar.gz -C /opt2. 修改java配置路径。 cd /opt/hadoop-3.2.4/etc…

微服务OAuth 2.1认证授权Demo方案(Spring Security 6)

文章目录 一、介绍二、auth微服务代码1. SecurityConfig2. UserDetailsService3. 总结 三、gateway微服务代码1. 统一处理CORS问题 四、content微服务代码1. controller2. SecurityConfig3. 解析JWT Utils4. 总结 五、一些坑 书接上文 微服务OAuth 2.1认证授权可行性方案(Sprin…

端口号被占用怎么解决

1、快捷键"winR"打开运行&#xff0c;在其中输入"cmd"命令&#xff0c;回车键打开命令提示符。 2、进入窗口后&#xff0c;输入"netstat -ano"命令&#xff0c;可以用来查看所有窗口被占用的情况。 比如端口号为7680的端口被占用了&#xff0c…

【开工大吉】推荐4款开源、美观的WPF UI组件库

WPF介绍 WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定、样式和模板、动画效果等功能&#xff0c;让开发者可以创建出吸引人且交互性强的应用程序。 HandyControl HandyControl是一套WPF控件库&#xf…

socket通信 smallchat简介

文章目录 前言一、socket的基本操作(1) socket()函数(2) bind()函数(3) listen()、connect()函数(4) accept()函数(5) read()、write()等函数(6) close()函数 二、smallchat代码流程smallchat-server.csmallchat-client.cchatlib.c 参考资料 前言 本文介绍了socket通信的相关A…

VNCTF2024misc方向部分wp

文章目录 sqlsharkLearnOpenGLez_msbOnlyLocalSql sqlshark tshark -r sqlshark.pcap -Y "http" -T fields -e frame.len -e http.file_data > data.txt不太像常规的盲注&#xff0c;一次性发送两条很类似的payload&#xff0c;比常规的多了一个least在判断passw…

并发编程-JUC-原子类

JUC 整体概览 原子类 基本类型-使用原子的方式更新基本类型 AtomicInteger&#xff1a;整形原子类AtomicLong&#xff1a;长整型原子类AtomicBoolean &#xff1a;布尔型原子类 引用类型 AtomicReference&#xff1a;引用类型原子类AtomicStampedReference&#xff1a;原子更新…

协调尺度:特征缩放在机器学习中的重要作用

目录 一、介绍 二、背景知识 三、了解功能缩放 四、特征缩放方法 五、特征缩放的重要性 六、实际意义 七、代码 八、结论 一、介绍 特征缩放是机器学习和数据分析预处理阶段的关键步骤&#xff0c;在优化各种算法的性能和效率方面起着至关重要的作用。本文深入探讨了特征缩放的…

LeetCode JS专栏刷题笔记(一)

一、前言 LeetCode 在前不久出了一个 JavaScript 专栏&#xff0c;这个专栏一个目的是为了非前端工程师学习 JS&#xff0c;另一个是为了前端工程师提升 JS 能力。 因此在这个专栏中&#xff0c;基本不涉及什么具体算法问题&#xff0c;都是一些 JS 的入门语法与常见的 JS 面…

【c++ debug】记一次protobuf结构相关的coredump问题

文章目录 1. 问题现象2. 问题描述3. 问题分析4. 问题根因5. 问题修复6. 补充&#xff1a;类成员变量定义为引用类型 1. 问题现象 其中curr_lanes是一个目标上一帧的当前车道current_lanes_curr_lane是lane_id对应的LaneInfo信息现象&#xff1a;在lane_info->lane().success…

【Java面试】MongoDB

目录 1、mongodb是什么&#xff1f;2、mongodb特点什么是NoSQL数据库&#xff1f;NoSQL和RDBMS有什么区别&#xff1f;在哪些情况下使用和不使用NoSQL数据库&#xff1f;NoSQL数据库有哪些类型?启用备份故障恢复需要多久什么是master或primary什么是secondary或slave系列文章版…

多模态基础---BERT

1. BERT简介 BERT用于将一个输入的句子转换为word_embedding&#xff0c;本质上是多个Transformer的Encoder堆叠在一起。 其中单个Transformer Encoder结构如下&#xff1a; BERT-Base采用了12个Transformer Encoder。 BERT-large采用了24个Transformer Encoder。 2. BERT的…

VPX信号处理卡设计原理图:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 信号处理 无线电通信

一、概述 本板卡基于标准6U VPX 架构&#xff0c;为通用高性能信号处理平台&#xff0c;系我公司自主研发。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司Virtex 7系列的FPGA XC7V690T-2FFG1761I作为主处理器&#xff0c;Xilinx 的Aritex XC7A200T作为辅助处理器。XC7A2…

JVS智能BI的ETL数据集实践:数据自动化分析的秘诀

数据集是JVS-智能BI中承载数据、使用数据、管理数据的基础&#xff0c;同样也是构建数据分析的基础。可以通俗地将其理解为数据库中的普通的表&#xff0c;它来源于智能的ETL数据加工工具&#xff0c;可以将数据集进行分析图表、统计报表、数字大屏、数据服务等制作。 数据集管…

ElasticSearch之Index Template 和Dynamic Template

写在前面 在ElasticSearch之Mapping 一文中我们一起看了es的dynamic mapping机制&#xff0c;通过该机制允许我们不需要显式的定义mapping信息&#xff0c;而是es根据插入的文档值来自动生成 &#xff0c;比如插入如下的文档&#xff1a; {"firstName": "Chan…