腾讯云-对象存储服务(COS)的使用总结-JavaScript篇

news2024/12/22 12:50:26

简介

对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、可靠安全等优点。通过控制台、API、SDK 和工具等多样化方式,用户可简单、快速地接入 COS,进行任意格式文件的上传、下载和管理,实现海量数据存储和管理。同时遍布全国范围的 CDN/EdgeOne 节点可以对文件下载进行加速。

前言

前几天,我们分享了关于服务器端腾讯云-对象存储服务(COS)的使用总结为了安全起见,配置放在服务器端,通过服务器端生成临时密钥供客户端使用,一般在30分钟左右的有效时长,可以看出,服务器端只是起到一个配角作用,今天,我们主要讲一下主角对对象存储服务的API调用,也就是图片中的1,4,5的操作。
在这里插入图片描述

引入库

package.json里添加如下的库

  "dependencies": {
    "cos-js-sdk-v5": "^1.4.20"
  }

具体使用

我们书写工具类upFile.js,包含了上传图片和视频到腾讯云COS的功能

import modal from '@/utils/modal.js';
import request from '@/utils/request';
import COS from 'cos-js-sdk-v5';
const cosSessionKey = 'cos_session'

/**获取cos临时密钥等信息*/
function getCosInfo() {
	return new Promise((resolve, rejct) => {
		request({
			url: '/system/cos/get',
			method: 'get',
		}).then(res => {
			var data = res.data
			if (data) {
				uni.setStorageSync(cosSessionKey, data);
				resolve(data);
			}
		})
	})
}

var cos = new COS({
	SimpleUploadMethod: 'putObject',
	getAuthorization: function(options, callback) {
		var cosData = uni.getStorageSync(cosSessionKey);
		callback({
			TmpSecretId: cosData.secretId,
			TmpSecretKey: cosData.secretKey,
			// v1.2.0之前版本的 SDK 使用 XCosSecurityToken 而不是 SecurityToken
			SecurityToken: cosData.sessionToken,
			// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
			StartTime: cosData.startTime, // 时间戳,单位秒,如:1580000000
			ExpiredTime: cosData.expiredTime, // 时间戳,单位秒,如:1580000900
		});

	}
});

// 上传文件到腾讯云
const cosUpLoadFile = async (params) => {
	let uploadFile = '';
	await uniChooseImage().then(res => {
		uploadFile = res
	})
	return cosUploadFile(uploadFile, params);
};

// 选择图片
const uniChooseImage = () => {
	return new Promise((resolve, rejct) => {
		uni.chooseImage({
			// 从本地相册选择图片或使用相机拍照。
			count: 1, //默认选择1张图片
			sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有
			success: res1 => {
				resolve(res1.tempFiles[0]);
			}
		});
	});
}

const cosUploadFile = async (file, params) => {
	var cosData = uni.getStorageSync(cosSessionKey);
	if (!cosData || !cosData.bucket) { //如果cos信息不存在
		//等待获取到cosData
		await getCosInfo().then(res => {
			cosData = res
		});
	}
	let promise = new Promise((resolve, rejct) => {
		modal.loading("上传中...")
		cos.uploadFile({
			/* 填入您自己的存储桶,必须字段 */
			Bucket: cosData.bucket,
			/* 存储桶所在地域,例如ap-beijing,必须字段 */
			Region: cosData.region,
			/* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),必须字段 */
			Key: params.uploadKey,
			/* 必须,上传文件对象,可以是input[type="file"]标签选择本地文件后得到的file对象 */
			Body: file,
			/* 触发分块上传的阈值,超过5MB使用分块上传,非必须 */
			SliceSize: 1024 * 1024 * 5,
			onTaskReady: function(taskId) {
				/* 非必须 */
				console.log(taskId);
			},
			onProgress: function(progressData) {
				/* 非必须 */
				console.log(JSON.stringify(progressData));
			},
			onFileFinish: function(err, data, options) {
				/* 非必须 */
				console.log(options.Key + '上传' + (err ? '失败' : '完成'));
			},
			// 支持自定义headers 非必须
			Headers: {
				'x-cos-meta-test': 123
			},
		}, function(err, data) {
			if (data && data.statusCode == 200) {
				let datas = {
					imgUrl: 'https://' + data.Location,
					imgKey: params.uploadKey
				}
				resolve(datas);
			} else if (err && err.statusCode == 403) {
				if ("Request has expired" == err.message) {
					console.log("失效Request has expired!重新获取cos信息");
					uni.removeStorageSync(cosSessionKey);
					cosUploadFile(file, params).then(res => {
						resolve(res);
					});
				}
			} else {
				modal.msg(err ? err.message : "上传失败!");
			}
			uni.hideLoading();
		});
	});
	return promise;
}

const cosDeleteFile = async (params) => {
	var cosData = uni.getStorageSync(cosSessionKey);
	if (!cosData || !cosData.bucket) { //如果cos信息不存在
		//等待获取到cosData
		await getCosInfo().then(res => {
			cosData = res
		});
	}
	console.log(params.uploadKey);
	cos.deleteObject({
		/* 填入您自己的存储桶,必须字段 */
		Bucket: cosData.bucket,
		/* 存储桶所在地域,例如ap-beijing,必须字段 */
		Region: cosData.region,
		Key: params.uploadKey,
	}, function(err, data) {
		console.log("deleteObject");
		console.log(err || data);
		if (err && err.statusCode == 403) {
			if ("Request has expired" == err.message) {
				console.log("失效Request has expired!重新获取cos信息");
				uni.removeStorageSync(cosSessionKey);
				cosDeleteFile(params);
			}
		}
	});
}

export default {
	cosUpLoadFile,
	cosDeleteFile
}

先发起上传图片请求,看下本地有没有临时密钥,如果没有则,通过发送请求https://*****.com/system/cos/get从服务器获取,获取结果如下:

{
  "code": 200,
  "msg": "处理成功",
  "time": 1693467116217,
  "data": {
    "bucket": "gamioo2010-12********2",
    "region": "ap-shanghai",
    "secretId": "AKIDdPg4NmRr****************************************EXdXdkWNIn2z",
    "secretKey": "g7drx*********************************tiW5EM=",
    "sessionToken": "EJn8gbXdS6r579C9RTOaGmR22S**************************FFB6uFy61jg",
    "startTime": 1693467116,
    "expiredTime": 1693467176
  }
}

然后把这份临时密钥数据存到local Storage, 供后续的cos 存/取/删除对象使用,直到使用COS服务返回Request has expired 错误码后,那么再次通过/system/cos/get请求向服务器获取一次临时密钥,
具体使用,身份证图片上传:

	import upFile from '@/utils/upFile.js';
			uploadKey(imgName) {
				return "idCard/" + this.userInfo.id + '/' + imgName + '.jpg';
			},
			uploadIdImg(imgName) {
				upFile.cosUpLoadFile({
					uploadKey: this.uploadKey(imgName),
				}).then(res => {
					console.log(res);
					if ('front' == imgName) {
						this.formData.front = res.imgUrl;
					} else {
						this.formData.back = res.imgUrl;
					}
				})
			},

那么,如何往cos服务存对象的呢?
本质发了个put 的URL请求,这串url 的组成规则实际上为 https://[bucket].[region].myqcloud.com/{key}
例如:

https://gamioo2010-1***********.cos.ap-shanghai.myqcloud.com/idCard/11/back.jpg

正常情况下,会返回对象的存储地址,接下去就可以做后续的逻辑处理:

{
    "imgUrl": "https://gamioo2010-***********.cos.ap-shanghai.myqcloud.com/idCard/11/front.jpg",
    "imgKey": "idCard/11/front.jpg"
}

如果返回Request has expired,

PUT https://gamioo2010-***********.cos.ap-shanghai.myqcloud.com/idCard/11/back.jpg 403 (Forbidden)
{"loaded":130736,"total":130736,"speed":274079.66,"percent":1}
 cos,postobject-err] AccessDenied: Request has expired
at http://localhost:3200/node modules/.vite/deps/cos-js-sdk-v5.js?v=b340976d:9468:31
at xhr.onload (htto://1ocalost:3200/node modules/vite/dens/cos-s-Sdk-V5.1S?V-b340976d:2469:15

则重新发起获取临时密钥的请求,直到完成该过程。

总结

本文主要列举了客户端在拿到临时密钥后,如何进行后续的COS操作,本文暂时只举例了存储的操作,至于其他的COS接口调用,调用方法类似,我们不再赘述。

参考链接:
对象存储快速入门
上传对象

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT帮助高职院校学生实现个性化自适应学习与对话式学习

一、学习层面:ChatGPT帮助高职院校学生实现个性化自适应学习与对话式学习 1.帮助高职院校学生实现个性化自适应学习 数字技术的飞速发展引起了教育界和学术界对高职院校学生个性化自适应学习的更多关注和支持,其运作机制依赖于人工智能等技术&#xff0…

面经:微服务

文章目录 参考资料一. 微服务概述1. CAP理论2. BASE理论3. SpringBoot 与 SpringCloud对比 二. 服务注册:Zookeeper,Eureka,Nacos,Consul1. Nacos两种健康检查方式?2. nacos中负责负载均衡底层是如何实现的3. Nacos原理4. 临时实例和持久化(非临时)实例 …

微信小程序校园生活小助手+后台管理系统|前后分离VUE

《微信小程序校园生活小助手后台管理系统|前后分离VUE》该项目含有源码、文档等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&#…

【RISC-V】RISC-V寄存器

一、通用寄存器 32位RISC-V体系结构提供32个32位的整型通用寄存器寄存器别名全称说明X0zero零寄存器可做源寄存器(rs)或目标寄存器(rd)X1ra链接寄存器保存函数返回地址X2sp栈指针寄存器指向栈的地址X3gp全局寄存器用于链接器松弛优化X4tp线程寄存器常用于在OS中保存指向进程控…

金融风控数据分析-信用评分卡建模(附数据集下载地址)

本文引用自: 金融风控:信用评分卡建模流程 - 知乎 (zhihu.com) 在原文的基础上加上了一部分自己的理解,转载在CSDN上作为保留记录。 本文涉及到的数据集可直接从天池上面下载: Give Me Some Credit给我一些荣誉_数据集-阿里云…

数字化新零售平台系统提供商,门店商品信息智慧管理-亿发进销存

传统的批发零售业务模式正面临着市场需求变化的冲击。用户日益注重个性化、便捷性和体验感,新兴的新零售模式迅速崛起,改变了传统的零售格局。如何在保持传统业务的基础上,变革发展,成为了业界亟需解决的问题。 在这一背景下&…

Abaqus三维随机多面体插件—AbyssFish – Random Polyhedron Aggregate

插件介绍 AbyssFish – Random Polyhedron Aggregate 插件可在Abaqus软件内批量生成随机分布的三维多面体骨料模型。插件可指定骨料分布的区域、三种尺寸的粒径分布范围、多面体面数、各尺寸骨料的数量等信息,同时可控制骨料间的最小间距及插件的运行时间控制。 使…

Linux常用工具(pidstat stress cgroup)

目录 1.pidstat 2.stress 3.cgroup 4.使用cgroup进行内存限制 5.使用cgroup进行cpu使用率控制 1.pidstat 安装和使用(centos): yum install sysstats yum remove sysstats pidstat -u(默认),查看进程cpu使用情况: pidstat …

Spring MVC: 请求参数的获取

Spring MVC 前言通过 RequestParam 注解获取请求参数RequestParam用法 通过 ServletAPI 获取请求参数通过实体类对象获取请求参数附 前言 在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调…

解决 beego上传文件时 报http: no such file 错误

上传时文件上传失败: 关键报错的代码: //获得文件名filename := header.Filename//上传文件//注意,这里SaveToFile参数要跟传入的文件名的key一致,否则就会报http: no such fileerr = f.SaveToFile(filename, "./static/file/"+filename)if err != nil {logs.Error(e…

大数据课程K13——Spark的距离度量相似度度量

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的距离度量和相似度度量; ⚪ 掌握Spark的欧氏距离; ⚪ 掌握Spark的曼哈顿距离; ⚪ 掌握Spark的切比雪夫距离; ⚪ 掌握Spark的最小二乘法; 一、距离度量和相似度度量 1. …

linux系统(centos、Ubuntu、银河服务器)备份

制作u盘启动盘 下载usblive系统镜像 Get Kali | Kali Linux 下载u盘启动工具 balenaEtcher - Flash OS images to SD cards & USB drives 点击下载,等待下载完成 双击安装,等待安装完成 双击 启动 选择镜像 选择U盘 开始烧录 等地制作完成 进入…

PowerBuilder连接SQLITE3

PowerBuilder,一个古老的IDE,打算陆续发些相关的,也许还有人需要,内容可能涉及其他作者,但基本都是基于本人实践整理,如涉及归属,请联系. SQLite,轻型数据库,相对与PowerBuilder来说是个新事务,故发数来,以供参考. PB中使用OLE Microsoft OLE DB方式进行连接,如下 // Profile…

苹果启动2024年SRDP计划:邀请安全专家使用定制iPhone寻找漏洞

苹果公司昨天(8月30日)正式宣布开始接受2024 年iPhone安全研究设备计划的申请,iOS 安全研究人员可以在 10 月底之前申请安全研究设备 SRD。 SRD设备是专门向安全研究人员提供的iPhone14Pro,该设备具有专为安全研究而设计的特殊硬…

Message: ‘chromedriver‘ executable may have wrong permissions.

今天运行项目遇到如下代码 driverwebdriver.Chrome(chrome_driver, chrome_optionsoptions)上述代码运行报错如下: Message: chromedriver executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home出错的原…

ROS2学习(一):Ubuntu 22.04 安装 ROS2(Iron Irwini)

文章目录 一、ROS2(Iron Irwini)介绍二、ROS2(Iron Irwini)安装1.设置编码2.使能代码库3.安装ROS2 Iron 三、ROS2测试四、ROS2卸载 一、ROS2(Iron Irwini)介绍 官方文档 Iron Irwini版本支持的平台如下: 二、ROS2(Iron Irwini)安装 1.设置编码 sudo apt update…

MyBatis——MyBatis插件原理

摘要 本博文主要介绍MyBatis插件机原理,帮助大家更好的理解和学习MyBatis。 一、插件机制概述 MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包括: Executor (update, que…

高级IO(select、poll、epoll)

在介绍本文之前,先提出一个问题 什么是IO? 等数据拷贝 1.等 - IO事件就绪(检测功能成分) 2.数据拷贝 高效的IO就是:单位时间,等的比重越小,IO的效率越高 五种IO模型 IO模型: 阻塞式…

仓库运行状况如何得知?数据挖掘是关键!

库存、订单、出入库记录、物流信息、货物状态等数据,是仓库管理的重要组成部分。 仓库数据的重要性 做好仓库数据管理对企业的重要性不言而喻。通过有效地管理数据,企业可以更好地了解市场需求和库存情况,快速响应市场变化,提高库…

iOS开发Swift-5-自动布局AutoLayout-摇骰子App

1.在iOS坐标系中,以向左、向下为正方向。图片以左上角为基准点。 2.打开之前的摇骰子App,对它的界面做一些适应所有iPhone机型的效果。 3.先对上方logo做一个y轴约束和一个宽高约束。 宽高约束: 水平居中: 对y轴进行约束。将虚线点…