【关于我接触了Uview的Upload】——单图上传,多图上传,遇到的问题总结、直传阿里云Oss

news2024/11/29 10:44:41

Uview的Upload组件

前言

有很长一段时间没有更新了,由于工作的繁忙导致没有时间写博客,今天在做到公司特殊场景需要用到上传组件并直传阿里云Oss,这里简单讲讲我在完成前端项目中使用到Uview的Upload遇到的问题以及我是如何解决,直传阿里云Oss的。

版本

 uview-ui: "^2.0.31"
 node:14.18.1

官方地址

https://www.uviewui.com/components/upload.html

简单的使用方法

这里如果你单纯的想拿到上传之后的url的话,可以直接看官方实例:

使用

在这里插入图片描述

<script>
	export default {
		data() {
			return {
				fileList1: [],
			}
		},
		methods:{
			// 删除图片
			deletePic(event) {
				this[`fileList${event.name}`].splice(event.index, 1)
			},
			// 新增图片
			async afterRead(event) {
				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
				let lists = [].concat(event.file)
				let fileListLen = this[`fileList${event.name}`].length
				lists.map((item) => {
					this[`fileList${event.name}`].push({
						...item,
						status: 'uploading',
						message: '上传中'
					})
				})
				for (let i = 0; i < lists.length; i++) {
					const result = await this.uploadFilePromise(lists[i].url)
					let item = this[`fileList${event.name}`][fileListLen]
					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
						status: 'success',
						message: '',
						url: result
					}))
					fileListLen++
				}
			},
			uploadFilePromise(url) {
				return new Promise((resolve, reject) => {
					let a = uni.uploadFile({
						url: 'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址
						filePath: url,
						name: 'file',
						formData: {
							user: 'test'
						},
						success: (res) => {
							setTimeout(() => {
								resolve(res.data.data)
							}, 1000)
						}
					});
				})
			},
		}

	}
</script>

注意点

这里的:fileList=fileList1要与data中的fileList1一一对应,不能乱写,具体原因可以继续看下去。
他其实本质是对uniapp的upload的再次封装!

结果

我们使用这个组件上传后,我们可以打印出返回的event
在这里插入图片描述
这里是结果,

如果是单图上传,我们可以发现,我们的图片存储在了一个对象里,里面的file中有我们图片的名称,大小,以及临时存储路径,如果你传给后端只需要传链接,那么看这里就可以结束了,剩下的就是格式的问题,看后端需要什么样的图片格式,对blob流进行相应的转化即可,

如果是多图上传,那么file会有多个对象,也是同样的道理。
在这里插入图片描述

直传阿里云oss

这里属于是特殊的场景需求了,有需要的小伙伴可以看下去。
如果改造Uview的Upload来进行前端直传阿里云Oss
我们仔细观察官方实例,其实可以发现,上传的核心代码是在这里:

const result = await this.uploadFilePromise(lists[i].url)
		uploadFilePromise(url) {
				return new Promise((resolve, reject) => {
					let a = uni.uploadFile({
						url: 'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址
						filePath: url,
						name: 'file',
						formData: {
							user: 'test'
						},
						success: (res) => {
							setTimeout(() => {
								resolve(res.data.data)
							}, 1000)
						}
					});
				})
			},

通过循环遍历图片数组,将图片调用uploadFilePromise方法进行上传,我们拿到图片的临时url,使用uni.uploadFile方法进行上传图片,所以他其实本质是对uni的上传方法进行二次封装,那么清楚原理之后,我们进行改造,要直传阿里云Oss,首先我们得获得阿里云Oss的权限,这里一般情况都是通过后端拿到临时阿里云Oss访问权限,也就是我们所说的密钥

阿里云Oss官方地址

https://help.aliyun.com/document_detail/111265.html?spm=a2c4g.11186623.0.0.6f6d110aTbK5Vs

我们需要的就是这些
在这里插入图片描述

最重要的其实就是这两个,访问阿里云Oss,当然还有其他很多的参数,这个看具体的业务场景需求,可能还需要其他的参数,但是密钥是必须的,所以要想上传阿里云Oss,就得先获得权限,下面会解释遇到的坑。

accessid:密钥ID
signature:密钥
policy

方法

我们改造官方示例:

	let a = uni.uploadFile({
						url: your.host, // 仅为示例,非真实的接口地址,这里的地址是传阿里云oss的地址
						filePath: url,		//url就是你拿到的图片url,这里不用动
						fileType: type, //类型 ,这里是必填的,直接拿event里面的type即可
						name: 'file',  //不用动
						formData: {
							key: this.key,  //这里是指你存放到阿里云oss的路径
							region: 'oss-cn-shenzhen',  //这里是阿里云需要的地域
							policy: this.oss.policy, //签名
							signature: this.oss.signature, //密钥
							OSSAccessKeyId: this.oss.accessid, //id
						},
						success: (res) => {
							// setTimeout(() => {
							//   resolve(res.data.data)
							// }, 1000)
							resolve(res.data.data)
							//成功的回调
							}

遇到的问题

权限问题

在这里插入图片描述
我们发现,虽然返回的是uploadFile:ok,但是Oss中并没有,我们仔细看,其实还是失败的,是errMsg,这种一般是权限问题,可以跟后端沟通配合解决,报错中也会提示究竟是哪个权限有问题。

跨域问题

在这里插入图片描述

跨域的问题在浏览器中经常会有,这个网上的配置有很多,你可以参考一下,当然,最简单无脑的方式,你可以直接使用HbuilderX的内置浏览器,当然体验不是特别好,但是没有跨域的问题!

页面中使用多个Upload,出现的问题

我在使用官方示例没有问题,但当我使用多个Upload进行上传就出现了问题,找不到fileList
在这里插入图片描述
后来我发现了,官方实例中的这一句

let fileListLen = this[`fileList${event.name}`].length

这是Es6的模板字符串,跟我一样看不懂的,属实得多看看基础了

this[`fileList${event.name}`]

他其实是这个this.fileList+event.name
所以,注意:我们的upload中的name:fileList="xxx",不能自己去乱定义,你使用官方的示例,那就得遵守规则,这个name的值,其实就是event.name的值,如果你的name为“1”,那么:fileList="fileList1"就必须得这么写
同理可得:

<u-upload
		:fileList="fileList1"
		@afterRead="afterRead"
		@delete="deletePic"
		name="1"
		multiple
		:maxCount="10"
	></u-upload>

<u-upload
		:fileList="fileList2"
		@afterRead="afterRead"
		@delete="deletePic"
		name="2"
		multiple
		:maxCount="10"
	></u-upload>

	<u-upload
		:fileList="fileList3"
		@afterRead="afterRead"
		@delete="deletePic"
		name="3"
		multiple
		:maxCount="10"
	></u-upload>

data() {
			return {
				fileList1: [],
				fileList2: [],
				fileList3: [],
			}

你就得这么写,所以一开始使用为什么觉得这么命名那么奇怪,想自定义命名的同学们,那就得体验一下报错的快感了。

后言

我是前端小白,如果你觉得这篇文章有哪些不足之后,或者还遇到什么奇怪的问题,可以在评论区留言

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

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

相关文章

百万企业用户选择的华为云云服务器,你不来了解一下吗?

今天&#xff0c;企业对“云”的需求像水、电、天然气一样普遍&#xff0c;华为云服务器作为新产品迅速占领现有主机市场。但市面上云服务器的种类多不胜数&#xff0c;怎样才能选到适合自己的云服务器呢&#xff1f;在这里&#xff0c;我推荐华为云云服务器&#xff0c;因为它…

力扣hot100——第2天:4寻找两个正序数组的中位数、5最长回文子串、10正则表达式匹配

文章目录1.4寻找两个正序数组的中位数1.1.题目1.2.解答1.2.1.直接法&#xff1a;合并数组再求结果1.2.2.分治&#xff1a;无需合并数组1.2.3.log(n)的解法2.5最长回文子串3.10正则表达式匹配3.1.题目3.2.解答1.4寻找两个正序数组的中位数 参考&#xff1a;力扣题目链接&#x…

压力串级控制装置用于气动马达的高精度调节

摘要&#xff1a;气动马达作为一种将压缩空气的压力能转换为旋转机械能的装置&#xff0c;其运行的关键是要进行驱动气体压力的控制。本文介绍了目前气动马达压力控制装置的技术现状&#xff0c;特别指出了现有技术中使用电空变换器存在的不足&#xff0c;介绍了电空变换器的更…

深入理解java虚拟机:类加载及执行子系统的案例

文章目录1. 概述2. Tomcat&#xff1a;正统的类加载器结构3. OSGi&#xff1a;灵活的类加载器架构4. 字节码生成技术与动态代理的实现5. Retrotranslator&#xff1a;跨越JDK版本1. 概述 在Class文件格式与执行引擎这部分里&#xff0c;用户的程序能直接影响的内容并不太多&am…

Tableau数据分析数据可视化分析平台

Tableau数据分析&数据可视化分析平台​ 本文章内涉及的资源包以及素材均来自于互联网&#xff0c;仅供大家用来交流学习与研究使用&#xff0c;努力提升自己的一篇文章。各类安装包以及素材版权归属原版权方所有&#xff0c;版权争议与本人无关&#xff0c;用户本人下载后不…

Linux用户操作

用户操作 1、切换用户 root登录 切换到普通用户 howard 命令&#xff1a;su howard 再切换到root用户 一个是执行exit命令&#xff0c;二个是执行su root 查看环境变量 命令&#xff1a;env 切换到Howard用户查看 2、查看用户 查看所有用户 命令&#xff1a;cat …

深入理解Linux网络技术内幕(十)——帧的接收

文章目录前言与其他功能交互设备的开启和关闭队列通知内核帧已接收&#xff1a;NAPI和netif_rxNAPI简介NAPI所用之net_device字段net_rx_action和NAPI新旧驱动程序接口操作poll_list设备驱动程序与内核间的旧接口&#xff1a;netif_rx的第一部分netif_rx的初始任务管理队列以及…

2022最新鸽哒IM即时通讯系统源码 带安卓、苹果、PC端(全开源)+部署教程

提示&#xff1a;即时通讯&#xff0c;纯原生开发&#xff0c;各种功能应有尽有 内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 提示&#xff1a;即时通讯&#xff0c;纯原生开发&#xff0c;各种功能应有尽有 鸽哒是一款类似于v的即时…

供应生物素PEG衍生物试剂Biotin-PEG-NHS,NHS-PEG-Biotin,生物素PEG活性酯

1、名称 英文&#xff1a;Biotin-PEG-NHS&#xff0c;NHS-PEG-Biotin 中文&#xff1a;生物素-聚乙二醇-活性酯 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Biotin PEG NHS ester PEG 4、分子量&#xff1a;可定制&#xff0c;活性酯-聚乙二醇2-生物素&#xff0c…

Java RMI 远程代码执行漏洞

0x01 漏洞描述 - Java RMI 远程代码执行漏洞 - Java RMI服务是远程方法调用&#xff0c;是J2SE的一部分&#xff0c;能够让程序员开发出基于JAVA的分布式应用。一个RMI对象是一个远程Java对象&#xff0c;可以从另一个Java虚拟机上&#xff08;甚至跨过网络&#xff09;调用它…

SpringBoot项目打印接口请求日志,CommonsRequestLoggingFilter实现方式

文章目录需求背景效果图实现思路其他方案对比优缺点分析具体实现需求背景 线上项目出现bug时&#xff0c;可以通过接口的请求参数来排查定位问题。和业务方battle时&#xff0c;能够回怼他是自己操作的问题。 效果图 实现思路 Spring提供了CommonsRequestLoggingFilter过滤器…

opengl,opengl es,egl,glfw,glew

OpenGL ES之GLFW窗口搭建 - Plato - 博客园概述 本章节主要总结如何使用GLFW来创建Opengl窗口。主要包括如下内容&#xff1a; OpenGl窗口创建介绍 GLFW Window版编译介绍 GLFW简单工程源码介绍 OpenGL窗口创建介绍 能用于Ohttps://www.cnblogs.com/feng-sc/p/5093262.htmlOp…

事务-P26,P27

事务&#xff1a;要么都成功&#xff0c;要么都失败。例子&#xff1a;支付宝交易。 acid原则。 11直接移植10的代码 spring-11-transaction&#xff1a; UserMapper&#xff08;增加两个接口&#xff09; package com.Li.mapper;import com.Li.pojo.User;import java.util.…

C# 消息 界面卡顿 界面进程 工作进程

一 消息 消息与消息循环&#xff0c;是所有的GUI开发里共同的概念&#xff1a; 消息Message,有的地方也叫事件&#xff1b; ① 鼠标消息&#xff1b; ② 键盘消息&#xff1b; ③ 绘制事件&#xff1b; ④ 窗口最大化、最小化&#xff1b; 1 消息循环 消息循环&#xff0c;M…

10道不得不会的缓存面试题【缓存】

博主介绍&#xff1a; &#x1f680;自媒体 JavaPub 独立维护人&#xff0c;全网粉丝15w&#xff0c;csdn博客专家、java领域优质创作者&#xff0c;51ctoTOP10博主&#xff0c;知乎/掘金/华为云/阿里云/InfoQ等平台优质作者、专注于 Java、Go 技术领域和副业。&#x1f680; 最…

使用Conda

0. Anaconda Prompt 命令提示符 0.1 验证conda是否被安装 conda --version0.2 conda管理环境 可以用命令复制和删除环境 参考. 1. Conda管理包 1.1 常用包管理功能 查找包查看包安装包 查找分为精确查找和模糊查找&#xff0c;如下图所示 卸载包更新包 1.2 conda管理环…

【实习之velocity】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、图示二、应用场景1.Web应用程序&#xff1a;作为为应用程序的视图&#xff0c;显示数据2.源代码生成&#xff1a;Velocity可用于基于模板生成java源代码3.自…

[c++基础]-vector类

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、 vect…

scanf导致程序运行时出现stack smashing

一 栈溢出stack smashing 程序在运行期间破坏了已在操作系统里定义好的栈边界&#xff0c;这种行为具有破坏性&#xff0c;操作系统使用stack smashing detect机制来检测栈溢出。 二 栈溢出简单例子 实例一&#xff1a; #include <stdio.h> #include <stdlib.h>…

基于智能优化算法实现的机械臂避障路径规划(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 针对目前空间机械臂避障路径规划算法计算量大难以达到在线实时规划的缺点,对空间机械臂的在线实时避障路径规划问题进行了研究和…