腾讯云OSS文件上传功能
腾讯云COS介绍
腾讯云COS(Cloud Object Storage)是一种基于对象的存储服务,用于存储和管理海量的非结构化数据,如图片、音视频文件、备份数据等。它具有以下特点和优势:
- 高可靠性:采用分布式存储架构,数据会在多个设备上进行冗余备份,确保数据的高可靠性和持久性。
- 弹性扩展:支持根据业务需求自动扩展存储容量,无需担心存储空间不足的问题。
- 低成本:提供按需计费方式,用户只需支付实际使用的存储容量和数据传输流量,无需预付费。
- 安全性:支持数据加密传输和存储,保障数据的安全性和隐私性。
- 简单易用:提供简单的API接口和丰富的SDK,方便开发者快速集成和使用。
此外,腾讯云COS还广泛应用于以下场景:
- 静态网站托管:将网站的静态资源(如HTML、CSS、JavaScript、图片等)存储在COS中,实现高可用、高性能的静态网站托管。
- 大规模数据备份和归档:提供高可靠性和低成本的存储服务,适用于大规模数据备份和长期归档存储。
- 音视频存储和处理:支持存储和管理大规模的音视频文件,并提供音视频处理服务,如转码、截图、水印等。
- 移动应用数据存储:提供简单易用的API和SDK,方便移动应用将用户数据、图片、文件等存储在云端。
- 云原生应用存储:可以作为云原生应用的对象存储服务,存储应用程序的配置文件、日志文件、静态资源等。
总的来说,腾讯云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配置说明:
- 创建存储桶:首先,你需要在腾讯云COS控制台中创建一个或多个存储桶,用于存储你的数据。存储桶是COS中用于存储对象的容器,你可以根据业务需求创建不同的存储桶来组织和管理你的数据。
- 设置访问权限:为了保护你的数据安全,你需要为存储桶设置适当的访问权限。COS提供了多种访问权限控制方式,包括基于身份的访问控制(IAM)、存储桶策略、预签名URL等。你可以根据实际需求选择适合的权限控制方式,确保只有授权的用户或应用程序能够访问你的数据。
- 配置数据传输:如果你的数据需要从其他地方传输到COS,你可以配置数据传输任务。COS支持多种数据传输方式,包括使用COS的迁移工具、通过API接口上传数据、使用SDK进行数据传输等。你可以根据你的数据来源和目标选择适合的数据传输方式。
- 启用数据处理功能:COS还提供了一些数据处理功能,如图片处理、音视频处理等。如果你需要对这些类型的数据进行处理,可以在COS控制台中启用相应的处理功能,并配置相应的处理规则。
相关文章:

腾讯云OSS文件上传功能
腾讯云COS介绍 腾讯云COS(Cloud Object Storage)是一种基于对象的存储服务,用于存储和管理海量的非结构化数据,如图片、音视频文件、备份数据等。它具有以下特点和优势: 高可靠性:采用分布式存储架构&…...

2023 re:Invent 用 PartyRock 10 分钟构建你的 AI 应用
前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢,每次都能带来一些最前沿的方向标,这次也不例外。在看完一些 keynote 和介绍之后,我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…...

如何使用idea连接服务器上的mysql?
安全组进行开放 具体步骤 关闭防火墙 开放端口号 重启防火墙 firewall-cmd --reload在mysql进行修改配置 update user set host % where user root;flush privileges;使得其他网络也可以连接这个数据库 另外如果想要sqlyog或者其他图形化界面要连接到数据库可以看下面这…...

主流开发语言和开发环境介绍
主流开发语言和开发环境介绍文章目录 ⭐️ 主流开发语言:2024年2月编程语言排行榜(TIOBE前十)⭐️ 主流开发语言开发环境介绍1.Python1.1 **IDLE**1.2 **PyCharm**1.3 **Anaconda**1.4 **Jupyter Notebook**1.5 **Sublime Text** 2.C2.1 **De…...
samber/lo 库的使用方法: 处理 channel
samber/lo 库的使用方法: 处理 channel samber/lo 是一个 Go 语言库,提供了一些常用的集合操作函数,如 Filter、Map 和 FilterMap。汇总目录页面 这个库函数太多,因此我决定按照功能分别介绍,本文介绍的是 samber/lo…...

铌酸锂芯片与精密划片机:科技突破引领半导体制造新潮流
在当今快速发展的半导体行业中,一种结合了铌酸锂芯片与精密划片机的创新技术正在崭露头角。这种技术不仅引领着半导体制造领域的进步,更为其他产业带来了前所未有的变革。 铌酸锂芯片是一种新型的微电子芯片,它使用铌酸锂作为基底材料&#x…...

大数据计算技术秘史(上篇)
在之前的文章《2024 年,一个大数据从业者决定……》《存储技术背后的那些事儿》中,我们粗略地回顾了大数据领域的存储技术。在解决了「数据怎么存」之后,下一步就是解决「数据怎么用」的问题。 其实在大数据技术兴起之前,对于用户…...

论文精读--word2vec
word2vec从大量文本语料中以无监督方式学习语义知识,是用来生成词向量的工具 把文本分散嵌入到另一个离散空间,称作分布式表示,又称为词嵌入(word embedding)或词向量 Abstract We propose two novel model architec…...

Android13 针对low memory killer内存调优
引入概念 在旧版本的安卓系统中,当触发lmk(low memory killer)的时候一般认为就是内存不足导致,但是随着安卓版本的增加lmk的判断标准已经不仅仅是内存剩余大小,io,cpu同样会做评判,从而保证设备…...

【深入理解设计模式】 工厂设计模式
工厂设计模式 工厂设计模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中,我们定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂设计模式的目…...

Windows下搭建EFK实例
资源下载 elasticSearch :下载最新版本的就行 kibana filebeat:注意选择压缩包下载 更新elasticsearch.yml,默认端口9200: # Elasticsearch Configuration # # NOTE: Elasticsearch comes with reasonable defaults for most …...

工厂方法模式Factory Method
1.模式定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类 2.使用场景 1.当你不知道改使用对象的确切类型的时候 2.当你希望为库或框架提供扩展其内部组件的方法时 主要优点: 1.将具体产品和创建…...

Vue的个人笔记
Vue学习小tips ctrl s ----> 运行 alt b <scrip> 链接 <script src"https://cdn.jsdelivr.net/npm/vue2.7.16/dist/vue.js"></script> 插值表达式 指令...

linux platform架构下I2C接口驱动开发
目录 概述 1 认识I2C协议 1.1 初识I2C 1.2 I2C物理层 1.3 I2C协议分析 1.3.1 Start、Stop、ACK 信号 1.3.2 I2C协议的操作流程 1.3.3 操作I2C注意的问题 2 linux platform驱动开发 2.1 更新设备树 2.1.1 添加驱动节点 2.1.2 编译.dts 2.1.3 更新板卡中的.dtb 2.2 …...

基于机器学习的青藏高原高寒沼泽湿地蒸散发插补研究_王秀英_2022
基于机器学习的青藏高原高寒沼泽湿地蒸散发插补研究_王秀英_2022 摘要关键词 1 材料和方法1.1 研究区概况与数据来源1.2 研究方法 2 结果和分析2.1 蒸散发通量观测数据缺省状况2.2 蒸散发与气象因子的相关性分析2.3 不同气象因子输入组合下各模型算法精度对比2.4 随机森林回归模…...
Failed at the node-sass@4.14.1 postinstall script.
问题描述 安装sass # "node-sass": "^4.9.0" npm i node-sass报错如下 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! node-sass4.14.1 postinstall: node scripts/build.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the node-sass4…...

【鸿蒙系统学习笔记】网络请求
一、介绍 资料来自官网:文档中心 网络管理模块主要提供以下功能: HTTP数据请求:通过HTTP发起一个数据请求。WebSocket连接:使用WebSocket建立服务器与客户端的双向连接。Socket连接:通过Socket进行数据传输。 日常…...

LabVIEW风力机智能叶片控制系统
LabVIEW风力机智能叶片控制系统 介绍了一种风力机智能叶片控制系统的开发。通过利用LabVIEW软件与CDS技术,该系统能够实时监测并调整风力机叶片的角度,优化风能转换效率。此项技术不仅提高了风力发电的稳定性和效率,而且为风力机的智能化管…...
HarmonyOS Stage模型 权限申请
配置声明权限 在module.json5配置文件中声明权限。不论是system_grant还是user_grant类型都需要声明权限,否则应用将无法获得授权。 {"module" : {// ..."requestPermissions":[{"name": "ohos.permission.DISCOVER_BLUETOOTH…...
标题:从预编译到链接:探索C/C++程序的翻译环境全貌
引言 在软件开发的世界里,我们通常会遇到两种不同的环境——翻译环境与运行环境。今天,我们将聚焦于前者,深入剖析C/C程序生命周期中至关重要的“翻译环境”,即从源代码到可执行文件这一过程中涉及的四个关键阶段:预编…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...