腾讯云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程序生命周期中至关重要的“翻译环境”,即从源代码到可执行文件这一过程中涉及的四个关键阶段:预编…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...