腾讯云-对象存储服务(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.dataif (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 而不是 SecurityTokenSecurityToken: cosData.sessionToken,// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误StartTime: cosData.startTime, // 时间戳,单位秒,如:1580000000ExpiredTime: 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信息不存在//等待获取到cosDataawait 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信息不存在//等待获取到cosDataawait 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.rhkb.cn/news/119244.html

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

相关文章

部署单点elasticsearch

部署elasticsearch 创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络 docker network create es-net 拉取镜像 我们采用elasticsearch的7.12.1版本的镜像 docker pull elasticsearch:7.12.1 运行 运行docker命令&a…

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

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

如何在java中做基准测试

最近公司在搞新项目,由于是实验性质,且不会直接面对客户的项目,这次的技术选型非常激进,如,直接使用了Java 17。 作为公司里练习两年半的个人练习生,我自然也是深度的参与到了技术选型的工作中。不知道大家…

敏捷开发、V模型开发、瀑布模型

在软件开发领域,敏捷开发和V模型开发是两种主要的开发方法。它们之间的差异主要体现在开发过程的结构和组织方式上。在以下讨论中,我们将深入探讨这两种方法的特点和差异。 敏捷开发 敏捷开发是一种迭代和增量的软件开发方法,它强调灵活性和…

docker笔记7:Docker微服务实战

1.通过IDEA新建一个普通微服务模块 建Module docker_boot 改POM <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

解决Apache Tomcat “Request header is too large“ 异常 ‍

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

正则表达式 之 断言详解

正则表达式的先行断言和后行断言一共有 4 种形式&#xff1a; (?pattern) 零宽正向先行断言(zero-width positive lookahead assertion)(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)(?<pattern) 零宽正向后行断言(zero-width positive lookb…

rrweb录制用户的操作过程,并上传服务端

1、客户端 准备工作&#xff0c;需要使用到的包有rrweb&#xff08;录制&#xff09; rrwebPlayer&#xff08;播放&#xff09; pako&#xff08;压缩&#xff09; 1.1、录制&#xff1a;1.2、pako 压缩工具的使用方式 import * as rrweb from rrweblet dispose null let rr…

机械制图(CAD)

目录 第一课&#xff08;80分钟&#xff09; 第二课&#xff08;80分钟&#xff09; 力啥学机械制图&#xff1f;我们的工厂要加工机械&#xff0c;而加工机械零件前&#xff0c;我们要先给工人图纸来看,工人才知道该怎样加工&#xff0c;所以我们今天就来学习下怎样画出符何…

el-table中点击跳转到详情页的两种方法

跳转的两种写法: 1.使用keep-alive使组件缓存,防止刷新时参数丢失 keep-alive 组件用于缓存和保持组件的状态&#xff0c;而不是路由参数。它可以在组件切换时保留组件的状态&#xff0c;从而避免重新渲染和加载数据。 keep-alive 主要用于提高页面性能和用户体验&#xff0c;而…

element侧边栏子路由点击不高亮问题

最近自己封装侧边栏 又碰到了点击子路由不高亮的问题 <template><div class"aside"><el-scrollbar :vertical"true" class"scrollbar_left_nav"><el-menu :default-active"defaultActive" :collapse"$stor…

亚马逊云科技生成式AI技术辅助教学领域,近实时智能应答2D数字人搭建

早在大语言模型如GPT-3.5等的兴起和被日渐广泛的采用之前&#xff0c;教育行业已经在AI辅助教学领域有过各种各样的尝试。在教育行业&#xff0c;人工智能技术的采用帮助教育行业更好地实现教学目标&#xff0c;提高教学质量、学习效率、学习体验、学习成果。例如&#xff0c;人…

C++基础语法——多态

目录 1.什么是多态&#xff1f; 2.多态的定义与实现 ①多态的构成条件 ②虚函数 ③虚函数的重写 1.协变 2.析构函数的重写 ④final和override 1.final 2.override ⑤重载、重写&#xff08;覆盖&#xff09;与重定义&#xff08;隐藏&#xff09;的区别 3.什么是抽…

QTday3

1.保存文件 void Widget::on_save_clicked() {QString filename QFileDialog::getSaveFileName(this,"选择文件","F:\\study\\huaqing\\save","Text File(*.txt)");if(filename.isNull()){QMessageBox::information(this,"提示",&qu…

苹果macOS 14开发者预览版Beta 7发布 新增超过100款视频壁纸和屏保

8 月 31 日&#xff0c;苹果向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 7 更新&#xff08;内部版本号&#xff1a;23A5337a&#xff09;&#xff0c;本次更新距离上次发布隔了 8 天。 苹果发布 Beta 7 更新的同时&#xff0c;还发布了第 6 个公测版&#xff0c;正式版…

性能测试(测试系列10)

目录 前言&#xff1a; 1.什么是性能测试 1.1生活中遇到的软件问题 1.2性能测试的定义 1.3性能测试和功能测试有什么区别 1.4性能的好坏的区分 1.5影响一个软件性能的因素 2.为什么要进行性能测试 3.性能测试常见的术语以及衡量指标 3.1并发 3.2用户数 3.3响应时间 …

神经网络--感知机

感知机 单层感知机原理 单层感知机:解决二分类问题&#xff0c;激活函数一般使用sign函数,基于误分类点到超平面的距离总和来构造损失函数,由损失函数推导出模型中损失函数对参数 w w w和 b b b的梯度&#xff0c;利用梯度下降法从而进行参数更新。让1代表A类&#xff0c;0代…

关于异或的小疑惑

今天写c&#xff0c;当我写出如下代码时&#xff0c;编译器报错了 #include<bits/stdc.h>using namespace std;int main(){int a1,b3,c2,d6;// cout<<(a^b^c^d)<<endl;cout<<a^b^c^d<<endl;return 0; } D:\sublineText\demo\demo.cpp: In funct…

C++ do...while 循环

不像 for 和 while 循环&#xff0c;它们是在循环头部测试循环条件。do…while 循环是在循环的尾部检查它的条件。 do…while 循环与 while 循环类似&#xff0c;但是 do…while 循环会确保至少执行一次循环。 语法 C 中 do…while 循环的语法&#xff1a; do {statement(s…

煤矿监管电子封条算法

煤矿监管电子封条算法基于yolov5网络模型深度学习框架&#xff0c;先进技术的创新举措&#xff0c;煤矿监管电子封条算法通过在现场运料运人井口、回风井口、车辆出入口等关键位置进行人员进出、人数变化和设备开停等情况的识别和分析。YOLO检测速度非常快。标准版本的YOLO可以…