使用uniapp的uni.uploadFile(OBJECT)方法向后台node.js一次传多张图片

使用uniapp的uni.uploadFile(OBJECT)方法向后台node.js一次传多张图片

问题分析

(1)在学习了uniapp之后,我会一次传一张图片到后台去。
【很多教学视频都会教的,要是不会建议先看教学视频】
一般是利用uniapp的 uni.chooseImage(OBJECT) 方法获取照片的本地地址,在利用uni.uploadFile(OBJECT)方法传到后台,用的是filePath 这个参数。

(2)但是,在我写项目的时候,需要将一次传两张照片到后台,看uniapp的开发文档,不难发现需要使用files参数,这是一个Array类型的参数。但是,在将uni.chooseImage(OBJECT)会传的res.tempFiles给files进行发送到后台会报错,报了一个 【无效文件名 】 的错误。百度了也没找到合适的解决方法。

(3)最后找到了一个好的解决方法的做法是:将es.tempFiles重新封装成一个新的Object,用for循环一个一个封装,然后添加到数组fileList中,最后将这个数组给参数files,发送到后台。到此问题解决。

要是上面的文字枯燥,没看懂,可以结合以下关键代码,结合注释。

参考博客:https://blog.csdn.net/Shiny_boy_/article/details/123715437?spm=1001.2014.3001.5506

一、uniapp部分

<script>
	export default {
		data() {
			return {
				//imgA、imgB是我用到的两个变量,不需要管
				imgA: "../../static/img/face/face06.png",
				imgB: "../../static/img/face/face06.png",
				// !!! 就是将这个数组传到后端
				fileList: [],
				//这是我回传的数据,不用管
				ans: 0 
			}
		},
		methods: {
			chooseImages() {
			    //这句代码是根据我项目逻辑写的,每次调用该函数就重置这个数组,不用管
				this.fileList = [];
				//uni.chooseImage的参数可以常考uniapp的API文档
				uni.chooseImage({
					count: 2,	//照片的数量
					success: (res) => {
					    //选取的照片,传回来的数据,我这里包含了两个照片
						const files = res.tempFiles;
						//打印这个数据,可以看下该数据的结构是什么样的	
						console.log(files)
						
						// !!! 将res.tempFiles的数据重新构造成一个Object并加到数组fileList中去
						// !!! 我也不知道为什么要这么做,但是就是可以
						for (let i = 0; i < files.length; i++) {
							let obj = new Object();
							obj.name = 'photo' + i;
							obj.uri = files[i].path;
							this.fileList.push(obj);
						}
						
						// 使用uni.uploadFile传图片到后台,具体参考API文档
						// 以下代码都是很普通的,关键是上面的for循环
						uni.uploadFile({
							// url 是后端的接口,改成自己的就好
							url: 'http://localhost:7001/aifacecompare',
							files: this.fileList,
							success: (res) => {
								console.log(res)
								var obj = JSON.parse(res.data)
								console.log(obj)
								this.$nextTick(() => {
									this.ans = obj.Score;
								})
							},
							fail(res) {
								console.log(res)								
							}
						})
					}
				})
			}
		}
	}
</script>

二、node.js部分代码,仅供参考、
主要看下怎么获取后端传过来的数据。
其他代码是腾讯AI开发平台的代码,不需要理解。

async aifacecompare() {
		console.log("aifacecompare")
		//获取前端发送的图片
		var data2 = this.ctx.request.files
		console.log(data2[0],111111)
		console.log(data2[1],222222)
		
		//将图片转码
		var imgbufferA = fs.readFileSync(data2[0].filepath)
		var base64imgA = imgbufferA.toString("base64")
		var imgbufferB = fs.readFileSync(data2[1].filepath)
		var base64imgB = imgbufferB.toString("base64")

		//发送给ai平台
		const IaiClient = tencentcloud.iai.v20200303.Client;

		const clientConfig = {
			credential: {
				secretId: "AKIDOcaHhrkMiqhHZaKnzua090bvyjDRO4SX",
				secretKey: "pNddMoywd3C4fz2oJXVBajbCWaNt86nG",
			},
			region: "ap-guangzhou",
			profile: {
				httpProfile: {
					endpoint: "iai.tencentcloudapi.com",
				},
			},
		};

		const client = new IaiClient(clientConfig);
		const params = {
			"ImageA": base64imgA,
			"ImageB": base64imgB,
			"FaceModelVersion": "3.0",
			"QualityControl": 0,
			"NeedRotateDetection": 0
		};
		
		// 将处理结果回传给前端
		// 我这里调用了腾讯AI开发平台的接口
		// 测试,可以自定义一个返回的值
		// 例:this.ctx.body = "XXX"
		this.ctx.body = await client.CompareFace(params)
	}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用说明了uni.uploadFile(OBJECT)方法使用方式。如果希望返回一个uploadTask对象,需要至少传入success/fail/complete参数中的一个。如果没有传入success/fail/complete参数,则会返回封装后的Promise对象。通过uploadTask对象,可以监听上传进度变化事件,以及取消上传任务。可以通过uploadTask.onProgressUpdate()方法获取上传进度信息,并通过uploadTask.abort()方法取消上传任务。提供了一个示例,展示了uni.uploadFile(OBJECT)方法的具体用法。在示例中,首先调用uni.chooseImage()方法选择图片文件,然后通过uni.uploadFile()方法上传该文件。在上传过程中,可以通过uploadTask.onProgressUpdate()方法监听上传进度变化,如果上传进度超过50%,则通过uploadTask.abort()方法取消上传任务。展示了文件选择上传组件的使用方式。可以通过<uni-file-picker>标签选择任意文件并上传到当前绑定的服务空间。通过设置相应的事件监听函数,可以获取选择文件、上传进度、上传成功和上传失败等状态。在上传过程中,可以调用相应的方法来处理上传的文件和状态。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [8.9 本地资源上传到开发者服务器 uni.uploadFile(OBJECT)常用API【uni-app教程uniapp教程(黄菊华-跨平台...](https://blog.csdn.net/u013818205/article/details/109611789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [uniapp学习笔记——基于<uni-file-picker>组件和uni.uploadFile()方法实现图片上传](https://blog.csdn.net/hou_ge/article/details/131144871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值