当前位置: 首页 > article >正文

前端使用COS上传文件

实际项目中会利用COS去存储项目中上传的文件等

腾讯云对象存储(COS)除了提供多种API接口,还提供了丰富的SDK供开发者使用,作为前端,这里我参考的是JavaScript SDK文档

安装SDK

npm install cos-js-sdk-v5

使用

使用首先必须要引入SDK完成初始化cos实例,才可以调用SDK方法,例如cos.uploadFile、cos.getObject等

参考官方文档可知,SDK内部需要通过密钥生成签名,有单次临时密钥、临时密钥回调、永久密钥等,根据具体情况进行使用,这里我使用的是临时密钥回调

//在utils下新建cos.js文件用来存放相关逻辑代码

import COS from 'cos-js-sdk-v5';
let cos=null
const getCos=()=>{
//由于可能会有多文件/多次文件上传,因此这里可以加一个判断,即cos如果已经存在就不用再重新生成
	if(cos) return cos
	cos = new COS({
    	getAuthorization: async function (options, callback) {
      		const data = await fetchSts('xxxx'); // 需自行实现获取临时密钥逻辑
      		callback({
        		TmpSecretId: data.credentials.tmpSecretId,
        		TmpSecretKey: data.credentials.tmpSecretKey,
        		SecurityToken: data.credentials.sessionToken,
       		 // 建议返回服务器时间作为签名的开始时间,避免客户端本地时间偏差过大导致签名错误
        		StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
        		ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000000
        		ScopeLimit: true, // 细粒度控制权限需要设为 true,会限制密钥只在相同请求时重复使用
      		});
    	}
	});
	return cos
}

//使用上传文件
export const uploadEleFile =  ( eleFile )=> {
    const file=eleFile.raw
    let filename=file.name
    return new Promise( (resolve, reject) => {
        ...//根据自身项目需要进行的一些自定义操作
        getCos().uploadFile({
                Bucket: 'examplebucket-1250000000', /* 填写自己的 bucket,必须字段 */
      			Region: 'COS_REGION',     /* 存储桶所在地域,必须字段 */
      			Key: '1.jpg',              /* 存储在桶里的对象键(例如:1.jpg,a/b/test.txt,图片.jpg)支持中文,必须字段 */
      			Body: file, // 上传文件对象
      			SliceSize: 1024 * 1024 * 5, 
                // 上传任务创建时的回调,返回一个taskId,唯一标识上传任务,可用于上传任务的取消/停止/重新开始
                onTaskReady: (taskId) => {
                    eleFile.status = 'uploading'
                },
                //上传文件的进度回调函数
                onProgress: (progressData) => {           /* 非必须 */
                    eleFile.percentage = progressData.percent * 100
                },
                //文件完成或错误回调
                onFileFinish: async (err, data, options) => {
                	//上传失败
                    if (err) {
                        eleFile.status = 'fail'
                        reject(err)
                    } else {
                    	//上传成功
                        eleFile.status = 'success'
                        //上传成功后的自定义操作,有时上传后的文件我们需要获取来展示
                        let res = await await fetchSts('xxxx')//需自行实现获取
                        if (res) {
                            resolve(res)
                        }
                    }
                },
                // 支持自定义headers 非必须
                Headers: {
                },
            },
        )
    })
}

调用

在外部的el-upload组件中就可以使用

<script>
export default {
	data(){
		return {
			fileList:[]
		}
	},
	methods:{
		async sure(){
			for (const file of this.fileList) {
        		if (file.status !== 'ready') {
          			continue
        		}
        		let res = await uploadEleFile(file)
        		if (res) {
          			file.url = res.url
        		}
      		}
		}
	}
}
</script>


http://www.kler.cn/a/303585.html

相关文章:

  • 《C语言程序设计现代方法》note-4 基本类型 强制类型转换 类型定义
  • 跟我学C++中级篇——Design Patterns的通俗说法
  • Postman接口测试(断言、关联、参数化、输出测试报告)
  • 【postman】怎么通过curl看请求报什么错
  • 使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本
  • javaWeb小白项目--学生宿舍管理系统
  • 为什么要进行MySQL增量备份?
  • 【数据结构和算法实践-树-LeetCode112-路径总和】
  • 力扣: 四数相加II
  • Linux安装管理多版本JDK
  • CSS Clip-Path:重塑元素边界的艺术
  • mysql慢sql问题修复
  • 计算机毕业设计 自习室座位预约系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • qt操作excel(QAxObject详细介绍)
  • 论文解读《LaMP: When Large Language Models Meet Personalization》
  • 浏览器插件利器--allWebPluginV2.0.0.20-alpha版发布
  • 首批通过!华为云CodeArts Snap智能开发助手通过可信AI智能编码工具评估,获当前最高等级
  • 气膜体育馆:为学校打造智能化运动空间—轻空间
  • 响应式网站真的就只是多了一个媒体查询吗?
  • CSS学习17--CSS3 过渡、2D变形、3D变形、动画
  • linux 内核代码学习(九)--Linux内核启动和文件系统
  • MySQL 子查询
  • 计算几何学习
  • 【论文阅读】视觉分割新SOTA: Segment Anything(SAM)
  • C语言 | Leetcode C语言题解之第397题整数替换
  • CSS基本布局理解(测试)——WEB开发系列38