腾讯云-对象存储服务(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.hqwc.cn/news/102199.html

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

相关文章

单片机有哪些分类?

单片机有哪些分类? 1.AVR单片机-----速度快,一个时钟周期执行一条指令,而普通的51单片机需要12个时钟周期执行一条指令。当然,Atmel公司出品的AT89LP系列单片机也是一个时钟执行一条指令,但目前还未普及。AVR单片机比51单片机多…

Linux修复损坏的文件系统

如何判断文件系统是否损坏 当文件系统受损时,将会出现一些明显的迹象。例如,文件或文件夹无法访问、文件大小异常、系统启动慢或无法启动等。此外,系统也可能发出一些错误信息,如"Input/output error"、"Filesyst…

Android Automotive概述

Android开发者的新赛道 在智能手机行业初兴起时,包括BAT在内许多传统互联网企业都曾布局手机产业,但是随着手机市场的基本定型,造车似乎又成了各大资本下一个追逐的方向。百度、小米先后宣布造车,阿里巴巴则与上汽集团共同投资创…

【Arduino27】DHT11温湿度传感器模拟值实验

硬件准备 DHT11温湿度&#xff1a;1个 面包板&#xff1a;1个 杜邦线&#xff1a;3根 硬件连线 VDD引脚接 5V 电源 DATE引脚接 4号 接口 GND引脚接 GND 接口 软件程序 #include<DHT.h>#define DHT11_pin 4 //温湿度传感器引脚DHT dht(DHT11_pin,DHT11);float tem…

【SpringCloud微服务--Eureka服务注册中心】

SpringCloud微服务全家桶学习笔记【持续更新】 gitee仓库 内容&#xff1a;SpringCloud SpringCloud alibaba 技术栈&#xff1a;Java8mavengit&#xff0c;githubNginxRabbitMQSpringBoot2.0 微服务架构概述 微服务架构是一种架构模式&#xff0c;它提倡将单一应用程序划…

kubeadmin安装k8s集群

目录 一 、环境部署 1、服务器规划 2、环境准备 二、所有节点安装docker 1、配置yum源&#xff0c;安装docker 2、配置daemon.json文件 三、所有节点安装kubeadm、kubelet 和kubectl 四、部署k8s集群 1、查看初始化需要的镜像 2、导入镜像 3、初始化kubeadm 3.…

高忆管理:南京取消限购 苹果新机或搭载潜望式镜头

昨日&#xff0c;两市股指盘中单边下行。到收盘&#xff0c;沪指跌1.13%报3122.35点&#xff0c;深成指跌1.84%报10321.44点&#xff0c;创业板指跌2.11%报2056.98点&#xff0c;科创50指数跌3.72%&#xff1b;两市算计成交7668亿元。行业方面&#xff0c;半导体板块大幅下挫&a…

搭建RabbitMQ消息服务,整合SpringBoot实现收发消息

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN博客专家&#xff0c;蓝桥云课认证讲师。 目录 一、前言1.1 什么是消息队列1.2 RabbitMQ 是什么1.…

数据挖掘的学习路径

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

Llama-7b-hf和vicuna-7b-delta-v0合并成vicuna-7b-v0

最近使用pandagpt需要vicuna-7b-v0&#xff0c;重新过了一遍&#xff0c;前段时间部署了vicuna-7b-v3&#xff0c;还是有不少差别的&#xff0c;transforms和fastchat版本更新导致许多地方不匹配&#xff0c;出现很多错误&#xff0c;记录一下。 更多相关内容可见Fastchat实战…

恒运资本:银行股适合定投吗?为什么银行股适合定投?

在股票市场上&#xff0c;出资者能够通过手动不断的买入到达基金定投的效果&#xff0c;那么&#xff0c;银行股适合定投吗&#xff1f;为什么银行股适合定投&#xff1f;下面恒运资本为我们准备了相关内容&#xff0c;以供参考。 银行股适合定投&#xff0c;即通过定投不断的买…

XSS的分析

目录 1、XSS的原理 2、XSS的攻击类型 2.1 反射型XSS 2.2 存储型XSS 2.3 DOM-based 型 2.4 基于字符集的 XSS 2.5 基于 Flash 的跨站 XSS 2.6 未经验证的跳转 XSS 3、复现 3.1 反射性 3.2 DOM-based型 1、XSS的原理 XSS的原理是恶意攻击者往 Web 页面里插入恶意可执行…