前端阿里云OSS直传,微信小程序版本

news2024/12/24 11:44:31

前言:

网络上许多的文章资料,全是使用阿里云官方的SDK,ali-oss插件去做直传。可是各位素未谋面的朋友要注意,这个SDK它支持web环境使用,也就是PC端浏览器

项目环境切换到微信小程序,是无法使用这种方式的,当然官方也有给出微信小程序直传的文档,继续往下看。

支持配置OSS直传的callback参数,这是其它文章中没用到的


官方:如何使用ali-oss进行直传icon-default.png?t=N4P3https://help.aliyun.com/document_detail/64041.html?spm=a2c4g.383954.0.0.43c25e89vo4jkS

官方:微信小程序OSS直传icon-default.png?t=N4P3https://help.aliyun.com/document_detail/92883.html?spm=a2c4g.31925.0.0.24de344egXVqTI

代码:

酒过三巡我还是少说话,多贴代码。并且把一些踩坑的地方告诉大家。继续往下看。

首先需要下载三个库。

注意:官方文档是让我们使用import { Base64 } from 'js-base64';   
可是它会它会报错!!!根本用不了。
所以需要换成import base64 from 'base-64';import utf8 from 'utf8'

npm install crypto-js --save

npm install base-64 --save

npm install utf8 --save


crypto-js:是阿里官方的签名库
base-64、utf8:是用来转码,配合crypto-js使用的


签名不都是后端的事情吗?没错大部分是后端。

但是我在官方文档看到客户端也可以签名,然后这么随口一说。

我亲爱的后端同事便说:客户端(前端)也可以签名,那就你自己签名吧。

配置callback(可选,根据后端要求来决定是否需要)

为什么需要使用callback,这就是后端的骚操作。
他要我们把文件顺利传到OSS后,再让OSS去请求他的接口。
他接口会去做一些业务逻辑,比如改文件的重命名。

而callback则是配置,后端处理业务逻辑的接口地址、接请求参数。


直传OSS配置callback是有格式要求的,并且微信小程序端、web端,callback的配置格式要求还不一样。
这里可能是因为用户们很少用到callback参数,官方文档写得也不准确。
大家按照我代码来,指定是没问题的,细节我不想说了,有问题评论区交流。

import crypto from 'crypto-js'
import base64 from 'base-64'
import utf8 from 'utf8'
<script>
methods: {

    chooseAvatarEvent(event) {
      const { avatarUrl } = event.detail

      this.getFormDataParams().then(() => {
        this.uploadFile(avatarUrl, 'tmp/', e => {})
      })
    },

    // 计算签名。
    computeSignature(accessKeySecret, canonicalString) {
      console.log(crypto.enc)
      return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret))
    },

    getPolicyBase64() {
      const date = new Date()
      date.setHours(date.getHours() + 1)
      const policyText = {
        expiration: date.toISOString(), // 设置policy过期时间。
        conditions: [
          // 限制上传大小。
          ['content-length-range', 0, 1024 * 1024 * 1024],
        ],
      }
      return policyText
    },

    async getFormDataParams() {
      // 获取STS临时token,这是后端接口做的,找亲爱的后端
      const credentials = await queryOssGetStsToken()
      const policyText = this.getPolicyBase64()
      const uft8Str = utf8.encode(JSON.stringify(policyText))
      const policy = base64.encode(uft8Str)
      const signature = this.computeSignature(credentials.AccessKeySecret, policy)

      const user_id = this.userInfo.user_id

      const callback = {
        // 设置回调请求的服务器地址,且要求必须为公网地址。
        // 后端的接口地址:https://www.baidu.com/api/xxxx
        callbackUrl: credentials.callbackUrl,
        // 设置回调请求消息头中Host的值,即您的服务器配置的Host值。
        // host: 'yourHost',
        // 设置发起回调时请求body的值。
        callbackBody: 'bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&imageInfo.height=${imageInfo.height}&imageInfo.width=${imageInfo.width}&imageInfo.format=${imageInfo.format}&type=avatar&user_id=' +
						user_id,
        // 设置发起回调请求的Content-Type。
        callbackBodyType: 'application/x-www-form-urlencoded',
      }
      const uft8Str_callback = utf8.encode(JSON.stringify(callback))
      const base64_callback = base64.encode(uft8Str_callback)
      const formData = {
        OSSAccessKeyId: credentials.AccessKeyId,
        signature,
        policy,
        'success_action_status': '200',
        'x-oss-security-token': credentials.SecurityToken,
        callback: base64_callback,
      }
      this.formData = formData
      console.log('formData===', this.formData)
    },

    uploadFile(filePath, dir, successc, failc) {
      const _this = this
      // 获取上传的文件类型
      let fileTypeIndex = filePath.lastIndexOf('.')
      let fileType = filePath.substring(fileTypeIndex)

      //图片名字 可以自行定义,     这里是采用当前的时间戳 + 150内的随机数来给图片命名的
      // const aliyunFileKey = dir + new Date().getTime() + Math.floor(Math.random() * 150) + '.png';
      const aliyunFileKey = dir + new Date().getTime() + Math.floor(Math.random() * 150) + fileType

      uni.uploadFile({
        // 注意:阿里云OSS的访问地址,并不是接口请求域名
        url: 'http://pxxxxx-xxxx-xxx.oss-cn-shenzhen.aliyuncs.com', //阿里云OSS访问地址
        filePath: filePath, //要上传文件资源的路径
        name: 'file', //必须填file
        formData: {
          'key': aliyunFileKey,
          ...this.formData
        },
        callback: this.formData.callback,
        success: function(res) {
          const resObj = JSON.parse(res.data)
          _this.userInfo.avatar_id = resObj.data.id
          _this.userInfo.avatar = resObj.data.url
          console.log('上传成功===', resObj)
        },
        fail: function(err) {
         
          // err.wxaddinfo = aliyunServerURL
          // failc(err)
        },
      })
    }

  }
</script>
<template>
    <view class="item-panel flex-1">
	    <u-image :src="userInfo.avatar" width="80rpx" height="80rpx" shape="circle"></u-image>
	    <button class="upload-box" open-type="chooseAvatar" @chooseavatar="chooseAvatarEvent"></button>
        <view class="ml-20 flex ai-center">
	        <u-icon name="arrow-right"></u-icon>
	    </view>
    </view>
</template>

<style lang="scss" scoped>
    .item-panel {
		display: flex;
		position: relative;

		.upload-box {
			position: absolute;
			width: 100%;
			height: 100%;
			opacity: 0;
			right: 0;
			top: 0;
		}
	}
</style>

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

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

相关文章

Power BI Embedded自动缩放容量,为公司每个月节省上万元

哎&#xff0c;不知道今年行情怎么就这样了&#xff0c;大厂一边大批毕业生&#xff0c;一边大量招人。难道是今年的新人便宜&#xff1f;就连道哥&#xff08;吴翰清&#xff0c;阿里P10&#xff0c;中国顶级黑客&#xff09;都从阿里离职了&#xff0c;当年年少不懂学计算机&…

Nodejs批量处理图片小工具:批量修改图片信息

小工具一&#xff1a;批量修改文件夹里面的图片名称 步骤&#xff1a; 1.安装nodejs。 2.根据需要修改editFileName(filePath, formatName)函数的参数&#xff0c;也可以不改&#xff0c;直接将renameFile.js和img文件夹放在同一个目录下。 3.在renameFile.js目录下开启终端…

SQL报错this is incompatible with sql_mode=only_full_group_by

一、bug记录 1.1.bug截图 1.2.sql语句 SELECT id,batch_no,if_code,channel_mch_no,bill_date,bill_type,currency,order_id, channel_order_no,channel_amount,channel_fee_amount,channel_success_at, channel_user,channel_state,org_pay_order_id,channel_refund_amoun…

曾经由盛转衰的骈文,却引领后人在文质兼美的创作之路上坚定前行

又叫骈体文&#xff0c;是和散文相对应的一种文体&#xff0c;它兴起于汉末&#xff0c;形成于魏晋&#xff0c;最盛行于南北朝&#xff0c;在初唐、中唐、唐末、五代、宋初时也盛极一时。古人语&#xff1a;两马并驾为骈&#xff0c;所以骈文最大的特点是用对偶的手法&#xf…

Fiddler抓包工具之fiddler设置手机端抓包

fiddler设置手机端抓包 安卓手机抓包 第一步&#xff1a;配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内&#xff1b;首先从fiddler处获取到ip地址和端口号&#xff1a; &#xff0c;点击online&#xff0c;最后一行就是ip地址 2、路径&#xff1a;Tools》O…

数据库基础——10.子查询

这篇文章来讲一下数据库的子查询 目录 1. 需求分析与问题解决 1.1 实际问题 1.2 子查询的基本使用 1.3 子查询的分类 2. 单行子查询 2.1 单行比较操作符 2.2 代码示例 2.3 HAVING 中的子查询 2.4 CASE中的子查询 2.5 子查询中的空值问题 2.5 非法使用子查询​编辑…

数字IC验证高频面试问题整理(附答案)

后台有同学私信想要验证的面试题目&#xff0c;这不就来了~ Q1.权重约束中”:”和 /”的区别 : 操作符表示值范围内的每一个值的权重是相同的,比如[1:3]:40,表示1&#xff0c;2&#xff0c;3取到的概率为40/120&#xff1b; :&#xff0f;操作符表示权重要平均分到值范围内的…

spring security(密码编码器、授权,会话)

目录 密码编码器 授权决策 AffirmativeBased ConsensusBased UnanimousBased 授权 web授权 HttpSecurity常用方法及说明 方法授权 会话控制 会话超时 安全会话cookie 密码编码器 Spring Security为了适应多种多样的加密类型&#xff0c;又做了抽象&#xff0c;D…

虚拟机配置

配置虚拟机网络 创建虚拟机 20G 4G内存 初始化用户名和密码 zhao 123456 克隆拷贝2个虚拟机 配置内存为2G 修改主机名和固定IP hostnamectl set-hostname node1 hostnamectl set-hostname node2 vim /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl stop network s…

渗透测试辅助工具箱

0x01 说明 渗透测试辅助工具箱 运行条件&#xff1a;jdk8 双击即可运行 反弹shell&#xff0c;命令生成器&#xff0c;自动编码&#xff0c;输入对应IP端口即可&#xff0c;实现一劳永逸&#xff0c;集成一些小工具&#xff0c;辅助渗透&#xff0c;提高效率 输入框说明 L…

TDengine 报错 failed to connect to server, reason: Unable to establish connection

一、前文 TDengine 入门教程——导读 二、遇到问题 taos 命令行&#xff08;CLI&#xff09;连接不上&#xff0c;进不去。 [rootiZ2ze30dygwd6yh7gu6lskZ ~]# taos Welcome to the TDengine Command Line Interface, Client Version:3.0.0.1 Copyright (c) 2022 by TDengine…

基于Azure实现Java访问OpenAI

之前使用了Java代码访问OpenAI&#xff1a;OpenAI注册以及Java代码调用_雨欲语的博客-CSDN博客但是需要vpn才能访问&#xff0c;现在可以基于微软的Azure访问OpenAI&#xff0c;不再需要vpn&#xff0c;官方文档&#xff1a;快速入门 - 开始通过 Azure OpenAI 服务使用 ChatGPT…

【国产虚拟仪器】基于JFM7K325T(复旦微FPGA)的高速数据采集平台

板卡概述 XM714是自主研制的一款5路HD-SDI视频采集图像处理平台&#xff0c;该平台采用上海复旦微的高性能Kintex系列FPGA加上华为海思的高性能视频处理器HI3531DV200来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&#xff0c;支持多种…

python:容器:字符串——常用操作

字符串[下标]根据下标索引取出特定位置字符字符串.index(字符串)查找给定字符的第一个匹配项的下标字符串.replace(字符串1,字符串2) 将字符串内的全部字符串1&#xff0c;替换为字符串2 不会修改原字符串&#xff0c;而是得到一个新的 字符串.split(字符串) 按照给定字符串&am…

[高光谱]使用PyTorch的dataloader加载高光谱数据

本文实验的部分代码参考 Hyperspectral-Classificationhttps://github.com/eecn/Hyperspectral-Classification如果对dataloader的工作原理不太清楚可以参见 [Pytorch]DataSet和DataLoader逐句详解https://blog.csdn.net/weixin_37878740/article/details/129350390?spm1001…

使用Nextcloud搭建私人云盘,并内网穿透实现公网远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;使用Nextcl…

好程序员:如果你从6月份开始学Java编程......

现在学习Java编程还来得及&#xff1f;好程序员可以明确的告诉你&#xff1a;当然了~新手入门快&#xff0c;非常容易学。Java计算机语言也是一门面向对象的语言&#xff0c;更加符合人类的思想&#xff0c;所求皆对象&#xff0c;并没有指针等一些难理解的知识。Java覆盖面宽、…

2023最新软件测试面试题大全(包含答案)

前言 在我认为&#xff0c;对于测试面试以及进阶的最佳学习方法莫过于刷题博客书籍视频总结&#xff0c;前几者博主将淋漓尽致地挥毫于这篇博客文章中&#xff0c;至于总结在于个人&#xff0c;实际上越到后面你会发现面试并不难&#xff0c;其次就是在刷题的过程中有没有去思…

Power BI许可证差异(免费、Pro、PPU、Embedded、Premium)

不可否认&#xff0c;在商业BI软件中Power BI是最强大的&#xff0c;在2023年的Gartner的魔力象限中Power BI又是第一名Microsoft named a Leader in the 2023 Gartner Magic Quadrant™ for Analytics and BI PlatformsI[1] image.png 目前还没有使用Power BI的&#xff0c;甚…

Microsoft Build 发布,开发者可能关注的重点→

又是一年一度的 Microsoft Build 了&#xff0c;你有和我一样熬夜看了吗&#xff1f;如果没有&#xff0c;那么你就错过了一场精彩的技术盛宴。本次的 Microsoft Build&#xff0c;有非常多的干货&#xff0c;围绕打造 Copilot 应用展开。我会将基于 Data AI 比较重要的内容列…