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

简介

对象存储(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接口调用,调用方法类似,我们不再赘述。

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

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

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

相关文章

机器学习:异常检测实战

文章目录 Anomaly Detection目录任务介绍数据集方法评估Baseline报告报告评价标准 Anomaly Detection 目录 任务介绍 无监督的异常检测 数据集 方法 autoencode 是否能够还原出原始类型图片,基于重构loss来判断是否正常 重构误差当作异常分数 评估 采用ROC和AUC…

Gitlab创建一个空项目

1. 创建项目 Project slug是访问地址的后缀,跟前边的ProjectUrl拼在一起,就是此项目的首页地址; Visibility Level选择默认私有即可,选择内部或者公开,就会暴露代码。 勾选Readme选项,这样项目内默认会带…

探索OLED透明屏的优缺点:引领科技未来的革命性突破

OLED透明屏作为一项革命性的创新技术,其令人惊叹的透明度和柔性性能引起了全球范围内的关注。 然而,了解OLED透明屏的优缺点对于我们全面认识其在科技未来中的地位至关重要。 今天,尼伽将深入探讨OLED透明屏的优势和限制,并借助…

【重要】【转载】NOR Flash芯片内执行(XIP)

为什么程序不能直接在nandflash上执行?出于这个疑惑带来了这篇博文,是我在网上找了很多资料后总结的,假如有误,希望马上指出来,免得我误人子弟。谢谢! 首先认识下nandflash和norflash: NOR Flas…

Python学习 -- 异常分类

在编写Python代码时,异常处理是至关重要的一部分,它能够帮助我们更好地应对意外情况,提高程序的健壮性。本文将详细介绍Python中常见的异常类型,包括AttributeError、FileNotFoundError、IndexError、KeyError、NameError、TypeEr…

第十七课:利用 Setup Factory 制作 Qt 软件安装包

功能描述:详细介绍如何利用 Setup Factory 制作 Qt 软件安装包,从 Setup Factory 软件下载、安装,到如何利用 Setup Factory 制作软件安装包,手把手教你将 Qt 应用程序制作成具有安装向导的安装包。 一、Setup Factory 简介 Setu…

Java基础 数据结构一【栈、队列】

什么是数据结构 数据结构是计算机科学中的一个重要概念,用于组织和存储数据以便有效地进行访问、操作和管理。它涉及了如何在计算机内存中组织数据,以便于在不同操作中进行查找、插入、删除等操作 数据结构可以看作是一种数据的组织方式,不…

脚本掌控,Linux上实现Spring Boot(JAR包)开机自启

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: 脚本掌控,Linux上实现Spring Boot(JAR包&#x…

TCP/UDP原理

文章目录 一、端口1. 端口的定义和作用2.服务端和客户端的区别3.常见的知名端口号有 二、TCP的原理1.TCP头部封装格式2.TCP可靠性机制三次握手确认机制四次挥手RST结束连接窗口机制 3.完整性校验4.TCP特征5.TCP的适用场景 三、UDP的原理1.UDP头部封装格式2.UDP特征3.UDP的适用场…

编写c语言程序调用openssl编译出的动态链接库

文章目录 一、编译生成链接库二、示例一:调用RAND_bytes函数三、示例二:调用SHA256 一、编译生成链接库 下载安装openssl并编译生成链接库的过程在我的另一篇文章中已经详细说明了:Ubuntu中安装OpenSSL 此外,我们还需要提前了解…

Java“牵手”天猫商品历史价格信息API接口数据,天猫API接口申请指南

天猫平台商品历史价格接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、最低价、当前价格、价格信息等详细信息 。 获取商品历史价格接口API是一种用于获取电商平台…

linux————ELK(日志收集系统集群)

目录 一、为什么要使用ELK 二、ELK作用 二、组件 一、elasticsearch 特点 二、logstash 工作过程 INPUT(输入) FILETER(过滤) OUTPUTS(输出) 三、kibana 三、架构类型 ELK ELKK ELFK ELFKK EFK 四、构建ELk集群…

信息技术02--初/高中--分类选择题(377道题与解析)

文章目录 第一章 办公软件 1-96第二章 信息技术基础 1-41第三章 计算机系统基础 1-28第四章 多媒体技术 1-115第五章 计算机网络技术 1-50第六章 信息安全 1-3第七章 算法与程序简介 1-13第八章 数据结构 1-2第九章 数据库技术 1-20第十章 练习 1-9 第一章 办公软件 1-96 1、某…

【二维偏序】CF Edu10 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long long #define lowbit(x) (x & (-x))using i64 long long;constexpr int N 2e6 10; constexpr int M 2e6 10; constexpr int P 2e6; c…

研磨设计模式day14模板方法模式

目录 场景 原有逻辑 有何问题 解决方案 解决思路 代码实现 重写示例 模板方法的优缺点 模板方法的本质 何时选用 场景 现在模拟一个场景&#xff0c;两个人要登录一个系统&#xff0c;一个是管理员一个是用户&#xff0c;这两个不同身份的登录是由后端对应的两个接…

算法通关村第9关【黄金】| 两道有挑战的问题

1. 将有序数组转换为二叉搜索树 思路&#xff1a;二分法&#xff0c;这个算法保证了每次选择的中间元素都能保持左右子树的高度差不超过 1&#xff0c;从而构建一个高度平衡的二叉搜索树。这个过程类似于分治法&#xff0c;通过递归不断将大问题分解成小问题并解决。 找到数组…

API接口文档利器:Swagger 和 接口调试利器:Postman

2.接口相关工具 2.1API接口文档利器&#xff1a;Swagger 2.1.1Swagger介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务 (https://swagger.io/)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0…

开源在企业中的角色和价值

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

力扣92. 局部反转链表

92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&am…

基于Vue前端框架构建BI应用程序

一、什么是Vue&#xff1f; Vue&#xff08;Vue.js&#xff09;是一个轻量级、高性能、可组件化的MVVM库。简而言之&#xff0c;是一个构建数据驱动的web界面的渐进式框架。它采用MVVM思想&#xff0c;通过数据双向绑定实现数据的动态渲染&#xff0c;同时也支持组件化的开发方…