vue、thinkphp实现腾讯云对象存储COS图片上传

  • 环境:
    thinkphp6
    vue2
    vant2.12

  • composer安装qcloud-sts-sdk

composer require qcloud_sts/qcloud-sts-sdk
  • 获取COS临时id、key的sts接口
<?php
declare (strict_types = 1);namespace app\index\controller;
use QCloud\COSSTS\Sts;class CosController
{//http://localhost:8516/index/cos/stspublic function sts() {$sts = new Sts();$config = array('url' => 'https://sts.tencentcloudapi.com/', // url和domain保持一致'domain' => 'sts.tencentcloudapi.com', // 域名,非必须,默认为 sts.tencentcloudapi.com'proxy' => '','secretId' => 'xxxx', // 固定密钥,若为明文密钥,请直接以'xxx'形式填入,不要填写到getenv()函数中'secretKey' => 'xxxx', // 固定密钥,若为明文密钥,请直接以'xxx'形式填入,不要填写到getenv()函数中'bucket' => 'test-1253653367',//'test-1253653367', // 换成你的 bucket'region' => 'ap-shanghai', // 换成 bucket 所在园区'durationSeconds' => 1800, // 密钥有效期'allowPrefix' => array('2024/msc2024/*'), // 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)// 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923'allowActions' => array (// 简单上传'name/cos:PutObject','name/cos:PostObject',// 分片上传'name/cos:InitiateMultipartUpload','name/cos:ListMultipartUploads','name/cos:ListParts','name/cos:UploadPart','name/cos:CompleteMultipartUpload'),// 临时密钥生效条件,关于condition的详细设置规则和COS支持的condition类型可以参考 https://cloud.tencent.com/document/product/436/71306// "condition" => array(//     "ip_equal" => array(//         "qcs:ip" => array(//             "10.217.182.3/24",//             "111.21.33.72/24",//         )//     )// ));$tempKeys = $sts->getTempKeys($config);//echo json_encode($tempKeys);return json($tempKeys);// try {//     // 可能抛出异常的代码//     // 获取临时密钥,计算签名//     $tempKeys = $sts->getTempKeys($config);//     //echo json_encode($tempKeys);//     return json($tempKeys);// } catch (\Throwable $e) {//     // 异常处理代码//     return json(array('code'=>101, 'msg'=>$e->getMessage()));// }}
}

前端vue2代码,使用vant的文件上传组件

<van-uploader :after-read="handleUpload"></van-uploader>
data: {process: 0,isProcessVisible: false,uploadType: null, //1人像 2国徽 3自拍cos: null
}
handleUpload: function (res) {var file = res.filevar that = thisvar that = thisvar cosBucket = 'test-123456'var cosRegion = 'ap-shanghai'var cosPrefix = '2024/msc2024'let name = file.namelet size = file.sizelet ext = getFilePointExtName(name)let shortName = getFileName(name)let fileName = 'upload/' + getStrDateNoLine(new Date()) + "/" + uuid() + extlet fileKey = cosPrefix + '/' + fileNameif(ext!= '.jpg' && ext!= '.JPG' && ext!= '.png' && ext!= '.PNG') {//this.$Message.error('请上传jpg格式文件');vant.Toast('请上传jpg或png格式文件');return}if(size > 1024*1024*2) {vant.Toast('图片文件不要大于2M');return}//alert(fileName)//console.log(file)if(this.cos == null) {this.cos = new COS({// getAuthorization 必选参数getAuthorization: function (options, callback) {// 初始化时不会调用,只有调用 cos 方法(例如 cos.putObject)时才会进入// 异步获取临时密钥// 服务端 JS 和 PHP 例子:https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/// 服务端其他语言参考 COS STS SDK :https://github.com/tencentyun/qcloud-cos-sts-sdk// STS 详细文档指引看:https://cloud.tencent.com/document/product/436/14048const url = '/index/cos/sts'; // url 替换成您自己的后端服务const xhr = new XMLHttpRequest();let data = null;let credentials = null;xhr.open('GET', url, true);xhr.onload = function (e) {try {data = JSON.parse(e.target.responseText);credentials = data.credentials;} catch (e) {}if (!data || !credentials) {return console.error('credentials invalid:\n' + JSON.stringify(data, null, 2))};callback({TmpSecretId: credentials.tmpSecretId,TmpSecretKey: credentials.tmpSecretKey,SecurityToken: credentials.sessionToken,// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误StartTime: data.startTime, // 时间戳,单位秒,如:1580000000ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000000});};xhr.send();}});}// var cos = new COS({//   SecretId: 'xx',//   SecretKey: 'xx',// });that.isProcessVisible = truethat.process = 0this.cos.uploadFile({Bucket: cosBucket, /* 填写自己的bucket,必须字段 */Region: cosRegion,     /* 存储桶所在地域,必须字段 */Key: fileKey,              /* 存储在桶里的对象键(例如:1.jpg,a/b/test.txt,图片.jpg)支持中文,必须字段 */Body: file, // 上传文件对象SliceSize: 1024 * 1024 * 5,     /* 触发分块上传的阈值,超过5MB使用分块上传,小于5MB使用简单上传。可自行设置,非必须 */onProgress: function(progressData) {//console.log(JSON.stringify(progressData));that.process = Math.floor(progressData.percent*100)}}, function(err, data) {that.isProcessVisible = falseif (err) {console.log('上传失败', err);} else {console.log('上传成功');console.log('http://' + data.Location)var url = 'http://' + data.Location.replace("xxxx.cos.ap-shanghai.myqcloud.com", "cdn.xxx.xxx.com")console.log(url)}});return false
},
  • 用到的其它方法
function getFileName(fileName) {let pos = fileName.indexOf(".")if(pos >= 0) {return fileName.substr(0, pos)}return fileName
}function getFileExtName(fileName) {let pos = fileName.indexOf(".")if(pos >= 0) {return fileName.substr(pos+1)}return ''
}function getFilePointExtName(fileName) {var ext = getFileExtName(fileName)if(ext != '') {return '.' + ext}return ''
}function getStrDateNoLine(date) {var y = date.getFullYear();var m = date.getMonth() + 1;//获取当前月份的日期 var d = date.getDate();if (m < 10) {m = '0' + m;}if (d < 10) {d = '0' + d;}return y + "" + m + "" + d;
}//用于生成uuid
function S4() {return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}function uuid() {return (S4() + S4() + "" + S4() + "" + S4() + "" + S4() + "" + S4() + S4() + S4());
}

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

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

相关文章

如何为PostgreSQL设置自增主键?

在 PostgreSQL 中&#xff0c;自增主键通常是通过使用 SERIAL 类型或在新版本中使用 IDENTITY 列来实现的。 1. 使用 SERIAL 类型 SERIAL 是一个自动增加的整数&#xff0c;常用于主键。当插入新的行时&#xff0c;PostgreSQL 会自动为这个列生成一个新的值。   例如 CREAT…

PYQT5-自定义事件

from PyQt5.QtCore import QEvent, QObject from PyQt5.QtWidgets import QApplication import sys# 自定义事件类 class CustomEvent(QEvent):# PYQT5 预留给用户自定义事件类型的起点为 QEvent.User1000custom_event_type QEvent.registerEventType()# 也可以这样写# custom…

2024.2.22

P1162 #include<map> #include<vector> #include<iostream> #include<math.h> #include<algorithm> #include<string> using namespace std; const int N 1020; int n; int g[N][N];//标记数组 int a[N][N];//储存数组 int dx[] { -1…

webstorm光标变成方块解决办法_webstorm光标变粗不能换行

webstorms光标变了 键盘上的insert是切换的快捷键&#xff0c;敲insert就可以来回切换了

回顾 | Java面向对象 多态篇

多态是面向对象编程中的一个重要概念&#xff0c;它允许不同的对象对同一消息做出不同的响应。 通过多态&#xff0c;可以通过父类或接口定义的引用变量来操作子类或实现类的对象&#xff0c;从而实现同一方法在不同对象上的不同行为。 在Java中&#xff0c;多态性主要通过继…

双通道并行网络,想用哪个网络用哪个,MATLAB代码

本期可谓是宝藏篇&#xff01;学会本期的思想&#xff0c;帮助你分分钟找到创新点&#xff0c;且不与别人重复&#xff01; 本期采用MATLAB代码&#xff0c;实现一种“基于格拉姆角场与并行CNN的故障诊断方法”。该方法的具体实现可以参考文献&#xff1a; [1]李宗源,陈谦,钱…

React native更改包名后,启动app的activity包名不生效问题

这篇文章本不算记录的&#xff0c;因为实际开发中&#xff0c;类似这种小问题会有很多很多&#xff0c;因为导致问题的原因千奇百怪&#xff0c;解决方案也不尽相同&#xff0c;所以也都没有记录。 但今天看到我10年写的问题解决小文章&#xff0c;被网友收藏了&#xff0c; 感…

普中51单片机学习(EEPROM)

EEPROM IIC串行总线的组成及工作原理 I2C总线的数据传送 数据位的有效性规定 I2C总线进行数据传送时&#xff0c;时钟信号为高电平期间&#xff0c;数据线上的数据必须保持稳定&#xff0c;只有在时钟线上的信号为低电平期间&#xff0c;数据线上的高电平或低电平状态才允许…

分享WebGL物体三维建模

界面效果 代码结构 模型素材类似CT (Computed Tomography)&#xff0c;即电子计算机断层扫描&#xff0c;它是利用精确准直的X线束、γ射线、超声波等&#xff0c;与灵敏度极高的探测器一同围绕物体的某一部位作一个接一个的断面扫描。 坐标系统 渲染流程 渲染流程是个将之前准…

Sora:OpenAI引领AI视频新时代

Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨…

C++(12) 模板类、模板继承(严格模式和自由模式)

文章目录 模版类1. 模版类2. 模版参数限制3. 模版继承3.1 严格模式3.2 自由模式 4. 模版类的模版函数5. 返回值类型带有模版 模版类 1. 模版类 #include <iostream>using namespace std;/* 当前 Person 类型&#xff0c;声明了连个模版分别对应NameType 模版类型&#…

C++ array容器用法详解

array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全(原因后续会讲),且效率并没有因此变差。 和其它容器不同,array 容器的大小是固定的,无法动态的扩展或收缩,这也就意…

【SpringCloud】使用 Spring Cloud Alibaba 之 Sentinel 实现微服务的限流、降级、熔断

目录 一、Sentinel 介绍1.1 什么是 Sentinel1.2 Sentinel 特性1.3 限流、降级与熔断的区别 二、实战演示2.1 下载启动 Sentinel 控制台2.2 后端微服务接入 Sentinel 控制台2.2.1 引入 Sentinel 依赖2.2.2 添加 Sentinel 连接配置 2.3 使用 Sentinel 进行流控&#xff08;含限流…

SLAM ORB-SLAM2(19)特征点三角化

SLAM ORB-SLAM2(19)特征点三角化 1. 前言2. 初始化参数3. 计算投影矩阵4. 恢复三维点4.1. 计算推导4.2. Triangulate5. 检查三维点5.1. 检查三维点的深度值和视差角5.2. 检查空间点的重投影误差6. 最后处理1. 前言 在 《SLAM ORB-SLAM2(12)估算运动并初始地图点》 中了解到…

如何将cocos2d-x js打包部署到ios上 Mac M1系统

项目环境 cocos2d-x 3.13 xcode 12 mac m1 big sur 先找到你的项目 使用xcode软件打开上面这个文件 打开后应该是这个样子 执行编译运行就好了 可能会碰到的错误 在xcode11版本以上都会有这个错误&#xff0c;这是因为iOS11废弃了system。 将上面代码修改为 #if (CC_TARGE…

Java 面向对象进阶 16 接口的细节:成员特点和接口的各种关系(黑马)

成员变量默认修饰符是public static final的原因是&#xff1a; Java中接口中成员变量默认修饰符是public static final的原因是为了确保接口的成员变量都是公共的、静态的和不可修改的。 - public修饰符确保了接口的成员变量可以在任何地方被访问到。 - static修饰符使得接口…

vue-利用属性(v-if)控制表单(el-form-item)显示/隐藏

表单控制属性 v-if 示例&#xff1a; 通过switch组件作为开关&#xff0c;控制表单的显示与隐藏 <el-form-item label"创建数据集"><el-switch v-model"selectFormVisible"></el-switch></el-form-item><el-form-item label&…

Redis篇----第七篇

系列文章目录 文章目录 系列文章目录前言一、Redis 的回收策略(淘汰策略)?二、为什么 edis 需要把所有数据放到内存中?三、Redis 的同步机制了解么?四、Pipeline 有什么好处,为什么要用 pipeline?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍…

crontab history查看命令的执行时间

crontab crontab学习网站&#xff08;19. crontab 定时任务 — Linux Tools Quick Tutorial&#xff09; 例子 今天实际工作里用到的&#xff08;已经进行了防信息泄露处理 比如我现在希望每周三上午10:00之行一个php脚本 --gpt生成 00 10 * * 3 cd /home/user/project/r…

阿里云SSL免费证书到期自动申请部署程序

阿里云的免费证书只有3个月的有效期&#xff0c;不注意就过期了&#xff0c;还要手动申请然后部署&#xff0c;很是麻烦&#xff0c;于是写了这个小工具。上班期间抽空写的&#xff0c;没有仔细测试&#xff0c;可能存在一些问题&#xff0c;大家可以自己clone代码改改&#xf…