腾讯云存储桶对象存储COS,Web直传代码,使用临时授权验证,vue elementui的upload组件直接调用上传至cos

在main.js中添加如下代码,前提是引入cos的sdk。


//--上传到腾讯cos,这段代码写在main.js中
var Bucket = 'test-xxxxxxx';
var Region = 'ap-shanghai'; /* 存储桶所在地域,必须字段 */
let CosAuth = null;
let getCosAuth = (callback) => {
	$.ajax({
		type: "POST",
		contentType: "application/json;charset=UTF-8",
		headers: {
			'Content-Type': 'application/json;charset=utf8',
			'Authorization':  localStorage.getItem("token")
		},
		url: rootUrl + "/api/admin/get-cos-key",
		//后端接口返回临时秘钥信息
		data: null,
		//请求成功,这段是cos代码
		success: function(data) {
			var credentials = data.data && data.data.credentials;
			if (!data || !credentials) return console.error('credentials invalid');
			CosAuth = ({
				TmpSecretId: credentials.tmpSecretId,
				TmpSecretKey: credentials.tmpSecretKey,
				XCosSecurityToken: credentials.sessionToken,
				// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
				StartTime: data.data.start_time, // 时间戳,单位秒,如:1580000000
				ExpiredTime: data.data.expiredTime, // 时间戳,单位秒,如:1580000900
			});
			
			callback()

		},
		//请求失败,包含具体的错误信息
		error: function(e) {
			console.log(e.status);
			console.log(e.responseText);
		}
	});
}


Vue.prototype.uploadOss = fileObj => {
    //重点,getAuthorization内部封装函数
    let getCosAuth2 = (options, callback) => {
	    callback(CosAuth)
    }    
	getCosAuth(() => {
		var cos = new COS({
			getAuthorization: getCosAuth2//重点调用函数
		});
		let outurl ="我的域名";
		
		var myDate = new Date();
		var ossPath = 'files/' + myDate.getFullYear() + "-" + (myDate.getMonth() + 1);
		// 获取文件后缀
		var pathArr = fileObj.file.name.split('.')
		//  随机生成文件名称
		var fileRandName = Date.now() + "" + parseInt(Math.random() * 1000)
		var fileName = fileRandName + '.' + pathArr[pathArr.length - 1]
		// 要提交的key
		var fileKey = ossPath + "/" + fileName;
		let formdata = {
			Bucket: Bucket, 
			Region: Region,
			Key: fileKey,
			Body: fileObj.file,
			onTaskReady: function(tid) {
				
			},
			onHashProgress: function(progressData) {
				
			},
			onProgress: function(progressData) {
				
				if(fileObj.onProgress){
					fileObj.onProgress(progressData)
				}
				
			},
		}
		cos.putObject(formdata, function(err, data) {
			if (!err&&fileObj.onSuccess) {
				fileName = fileName.toLocaleLowerCase();
				//计算图片高度
				if (fileName.indexOf(".jpg") > 0 || fileName.indexOf(".jpeg") > 0 || fileName.indexOf(".png") > 0 || fileName
					.indexOf(
						".gif") > 0 || fileName.indexOf(".bmp") > 0) {
			
					var reader = new FileReader();
					reader.readAsDataURL(fileObj.file);
					reader.onload = function(theFile) {
						var image = new Image();
						image.src = theFile.target.result;
						image.onload = function() {
							fileObj.onSuccess({
								src: outurl + "/" + fileKey + "?s=" + this.width + "_" + this.height,
								fileName: fileObj.file.name
							})
			
						};
					};
				} else {
					fileObj.onSuccess({
						src: outurl + "/" + fileKey,
						fileName: fileObj.file.name
					})
				}
			
			}
			
			
		});
	})


}

 

vue文件里的upload组件修改,主要修改:http-request="uploadOss" 和 action=""这两个地方

<el-upload action="" :http-request="uploadOss" :multiple="true" :on-success="uploadCoverMore" :show-file-list="false" name="image">
       <el-button  size="small" type="primary">批量上传</el-button>
      </el-upload>

在 组件的success回调中会获取到返回的url和图片名称信息,如果需要上传进度,在onProgress方法中回调即可

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
你可以使用Ant Design的上传组件,在Vue 3中进行父组件调用。首先,你需要在父组件引入Ant Design的Upload组件: ``` <template> <div> <a-upload :action="uploadUrl" :headers="headers" :data="data" :multiple="multiple" :before-upload="beforeUpload" :on-progress="onProgress" :on-success="onSuccess" :on-error="onError" :disabled="disabled" > <a-button> <a-icon type="upload"></a-icon> Click to Upload </a-button> </a-upload> </div> </template> <script> import { defineComponent } from 'vue'; import { Upload, Button, Icon } from 'ant-design-vue'; export default defineComponent({ name: 'ParentComponent', components: { 'a-upload': Upload, 'a-button': Button, 'a-icon': Icon }, data() { return { uploadUrl: 'https://www.example.com/upload', headers: {}, data: {}, multiple: true, disabled: false }; }, methods: { beforeUpload() { // Do something before upload }, onProgress() { // Do something on progress }, onSuccess() { // Do something on success }, onError() { // Do something on error } } }); </script> ``` 在父组件中,你需要设置上传组件的一些属性,例如上传的URL、请求头、数据、是否允许多文件上传、是否禁用等等。你还需要定义一些上传的回调函数,例如在上传之前执行的函数、上传进度更新函数、上传成功回调函数、上传失败回调函数等等。 在模板中,你可以使用`<a-upload>`标签来引用Ant Design的上传组件。你还可以使用`<a-button>`标签和`<a-icon>`标签来设置上传按钮的样式。 在子组件中,你可以使用`$emit`函数来触发父组件中定义的回调函数。例如,在上传成功时,你可以使用以下代码触发`onSuccess`函数: ``` this.$emit('on-success'); ``` 在父组件中,你可以使用`@`符号来绑定子组件触发的事件。例如,你可以使用以下代码来绑定上传成功事件: ``` <a-upload ... @on-success="onSuccess" > ``` 这样,当子组件触发上传成功事件时,父组件中定义的`onSuccess`函数就会被调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灿宝宝lo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值