uniapp h5项目上传图片到oss(纯前端)

需求:后端给前端一个oss上传地址,前端需要根据getCkOSSToken获取stsToken,使用client.put方法将图片上传成功,并且使用canvas压缩图片

效果图

废话不多说,直接上代码,代码可直接复制,运行

准备工作

cnpm install ali-oss --save在需要的页面引入
import OSS from 'ali-oss'

1.html

<view class="" style="margin-top: 20rpx;"><uni-file-picker limit="1" title="" @select="selectImg" @delete="deletePic" :sizeType="sizeType"></uni-file-picker></view>

2.javaScript

// 选择图片selectImg(e) {this.flag = truelet that = this// const OSS = require('ali-oss');let path = e.tempFiles[0].fileconsole.log(path,'path')const file = path;if (file) {that.compressImage(file, 1024, 0.2, (compressedBlob) => {const compressedFile = that.blobToFile(compressedBlob, file.name);// 这里拿到最终的File对象 compressedFile,可以用于上传等操作this.before(e.tempFiles[0].extname, compressedFile)});}},
/*** 压缩图片*/compressImage(file, maxWidth, quality, callback) {const reader = new FileReader();reader.onload = (e) => {const img = new Image();img.onload = () => {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');let width = img.width;let height = img.height;if (width > maxWidth) {height = Math.round((height *= maxWidth / width));width = maxWidth;}canvas.width = width;canvas.height = height;ctx.drawImage(img, 0, 0, width, height);canvas.toBlob((blob) => {callback(blob);}, "image/jpeg", quality);};img.src = e.target.result;};reader.readAsDataURL(file);},
/*** 使用uni-file-picker选择图片文件。读取图片文件并将其转换为Image对象。使用一个Canvas元素来绘制并压缩图片。将压缩后的图片从Canvas中导出为Blob对象。将Blob转换为File对象。* */blobToFile(blob, fileName) {blob.lastModifiedDate = new Date();blob.name = fileName;return new File([blob], fileName, {type: blob.type});},
//  上传图片路径格式为https://oss-token-test.oss-cn-hangzhou.aliyuncs.com/qzzw/202402/2024022917120012345.png 202402为获取当前年月日 20240229171200为获取当前年月日时分秒 12345为随机数before(extname, file) {let that = thisvar timestamp = new Date().getTime()var time = this.havetime(timestamp)var timeMonth = this.haveMonth(timestamp)var haveMonthDay = this.haveMonthDay(timestamp)uni.request({url: 'http://sts.ck9696.com/oss/ckOSSServer/getCkOSSToken',method: 'post',data: {'exchangeTime': time,'channelId': '1','channelNo': '1','channelPassword': '1','appVersion': '1','appMobileModel': '1'},success: function(res) {uni.showToast({title: res,icon: 'none',duration: 2000})res.data.data.bucket = 'oss-token-test'res.data.data.endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'res.data.data.stsToken = res.data.data.securityToken// res.data.data.securityToken = undefinedlet client = new OSS(res.data.data)let storeAs = nullstoreAs = '/bsh/' + timeMonth +'/' + time + Math.ceil(Math.random() * 10000) + '.' + extnameclient.put(storeAs, file).then(function(result) {that.formData.imgUrl = result.urlthat.ImgUrl = [{url: result.url}]console.log(that.ImgUrl, 'that.ImgUrl')uni.setStorageSync('ImgUrl', that.ImgUrl);}).catch(function(err) {// console.log(JSON.stringify(err), 'errrrrrrrrrrrrrrrrrrrrrrrrrrrrr')})},fail: function(res) {uni.showToast({title: res,icon: 'none',duration: 2000})}})},
haveMonth(unixtime) {var date = new Date(unixtime);var y = date.getFullYear();var m = date.getMonth() + 1;m = m < 10 ? ('0' + m) : m;var d = date.getDate();d = d < 10 ? ('0' + d) : d;var h = date.getHours();h = h < 10 ? ('0' + h) : h;var minute = date.getMinutes();var second = date.getSeconds();minute = minute < 10 ? ('0' + minute) : minute;second = second < 10 ? ('0' + second) : second;return y + '' + m// return y + '-' + m + '-' + d + ' ' + h + ':' + minute;},

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

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

相关文章

【C++11】智能指针

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解在C11中智能指针&#xff0c;自己能模拟实现 4 种智能指针 > 毒鸡汤&#xff1a;白日莫闲过&#xff0c;青春不再来。 > 专栏选自&#xff1…

箭头函数有哪些不适用场景

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

leaflet知识点:地图窗格panes的应用

一&#xff0c;需求背景 地图中存在无人机&#xff0c;停机坪&#xff0c;航线三个图层&#xff0c;需要实现无人机图层显示在最上面&#xff0c;停机坪图层显示在最下面&#xff0c;航线图层显示在中间。 二&#xff0c;遇到问题 由下图可知航线图层所在overlayPane窗格的z-…

【教程】ubuntu20.04 下配置 Charm-crypto 0.5 实验环境

目录 前言先决条件基本依赖安装准备好 gcc&#xff0c;make 和 perl准备好 m4&#xff0c;flex&#xff0c;bison 和 libssl-dev安装 Python3.x&#xff0c;pip3 和 pyparsing 安装 OpenSSL安装 GMP5.x安装 PBC安装 Charm-crypto5.0安装开发环境检验 Charm-crypto5.0 安装成功参…

AIGC教育行业全景报告:AI助教和家教成真,学习机迎来新机遇

原文&#xff1a;AIGC教育行业全景报告&#xff1a;AI助教和家教成真&#xff0c;学习机迎来新机遇 - AI新智界 图片来源&#xff1a;由无界AI生成 经过一年的快速迭代&#xff0c;业内对于生成式AI将会率先落地于哪些行业已经有了答案。 教育领域&#xff0c;不仅被OpenAI列…

实验案例二:配置路由器实现互通

1、实验环境 实验用具包括两台路由器{或交换机)&#xff0e;一根双绞线缆&#xff0c;一台PC&#xff0c;一条Console线缆 2、需求描述 如图6.14所示&#xff0c;将两台路由器的Gig0/0接口相连&#xff0e;通过一台PC连接设备的Console端口并配置P地址(192.168.1.0/24)&#…

规则引擎之LiteFlow应用

官网地址&#xff1a;LiteFlow DEMO 整体结构 1.引入maven依赖 <dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>2.11.4.2</version> </dependency> 2. 配置yml …

平台系统的微信支付服务突然不可用问题记录

背景 我们平台系统的微信支付突然不可用&#xff0c;用户点击支付都提示错误“系统繁忙”。 排查 查看日志&#xff0c;发现“支付聚合服务”调用“微信支付服务”的http请求返回read timeout&#xff0c;问题很显然出在“微信支付服务”。http请求报read timeout&#xff0…

OpenAI宣布GPT-4-Turbo全面升级,GPT-4 Turbo 新增视觉理解能力,可同时处理文本和图像信息

OpenAI宣布GPT-4-Turbo全面升级&#xff0c;GPT-4 Turbo with Vision新增视觉理解能力&#xff0c;可同时处理文本和图像信息&#xff0c;极大简化了开发流程。 OpenAI宣布GPT-4 Turbo全面升级&#xff01;根据官方说法&#xff0c;这一波 GPT 的升级包括&#xff1a; 更长的上…

由于找不到krpt.dll,无法继续执行代码的5种解决方法

在正常使用电脑的过程中&#xff0c;当尝试启动某个应用程序或者执行特定功能时&#xff0c;系统突然弹出一个错误提示窗口&#xff0c;明确指出由于缺失关键性文件——krpt.dll&#xff0c;导致当前运行的软件无法正常读取并执行相应的程序代码&#xff0c;进而无法顺利完成预…

初级软件测试常见问题

1.JMeter &#xff08;1&#xff09;在http请求的时候&#xff0c;消息体数据中的数据需要用{}和“”标记起来&#xff0c;变量要用${}括起来。 &#xff08;2&#xff09;在响应断言的时候&#xff0c;要根据测试模式输出的内容来改变测试字段&#xff0c;假如输出错误可以把…

根据ELK官网指引部署ELK- ECK-Elastic-​ Kibana​-Learn-ELK-(一)

**Attention: 1、You need open the ELK official website and step by step to deploy . 2、If you copy my command ,you must check them if it not match your environment . 一、official website Elastic documentation | Elastic Check there. 二、 ECK简介…