uniapp表单上传多张图片

本文展示了如何在uniapp中实现表单结合多图片上传的功能。前端使用了uni-popup组件创建弹窗表单,通过uni.chooseImage选择图片并上传,利用uni.uploadFile将图片和表单数据发送到后台。后台通过MultipartRequest接收并保存图片。注意,小程序仅支持单张图片上传。

uniapp实现表单内多图片上传

注意事项:只有app支持多图片上传,小程序只能一张一张传
需求描述:表单数据和选择的多张照片同时提交,效果如下所示:
在这里插入图片描述


话不多说,上代码,前端代码:
<template>
	<view>
			<u-popup :show="show" @close="close">
				<view style="display: flex;">
					<view class="form-left">
						问题描述
					</view>
					<view class="form-right">
						<textarea auto-height="true" v-model="formData.description" :cursor-spacing="150"></textarea>
					</view>
				</view>
				<view v-show="hasDescription" style="margin-left: 60px;">
					<text style="color: #FF3333;font-size: small;">请录入问题描述</text>
				</view>
				<view style="display: flex;">
					<view class="form-left">
						照片
					</view>
					<view style="margin-left: 6px;">
						<view style="display: flex;">
							<view v-for="(pic,index) in fileList" :key="index">
								<image :src="pic.uri" @click="imgPreview(pic)" class="upLoadImg"></image>
							</view>
							<image v-if="fileList.length < 3" src="../../static/icon/task/upload-pic.png" style="width: 36px;height: 36px;margin: 13px 16px;" @click="selectPics">
								
							</image>
						</view>
					</view>
				</view>
				<view style="padding: 20rpx; display: flex;justify-content: space-around;">
					<view  class="submit-button" @click="submit()">
						提交
					</view>
					<view class="cancel-button" @click="cancel">
						取消
					</view>
				</view>
			</u-popup>
		<
<think>由于问题涉及UniApp框架中的多图片上传,我们将使用uni.uploadFile API。但是,请注意,uni.uploadFile一次只能上传一个文件。因此,要实现多张图片上传,我们需要循环调用该API,或者使用Promise.all(或类似的并发控制)来同时上传多个文件。 然而,需要注意的是,小程序平台(如微信小程序)对并发请求数量有限制(通常最多10个)。因此,我们可能需要考虑使用循环上传或者使用队列控制并发数量。 下面我将提供两种方案: 1. 使用Promise.all进行并发上传(适用于图片数量较少,且不超过平台并发限制的情况) 2. 使用循环配合async/await逐个上传(如果图片数量多,为避免超过并发限制,也可以使用,但速度较慢) 3. 使用并发控制(例如使用p-limit库,但UniApp中可能没有内置,需要自己实现或引入) 由于UniApp中不能直接使用npm库(除非使用HBuilderX支持npm或者自己处理),因此我们将自己实现一个并发控制函数。 但是,考虑到问题只要求使用uni.uploadFile,我们将展示前两种方法,并简单介绍第三种。 另外,上传图片通常需要从用户选择图片开始,因此我们也会用到uni.chooseImage方法。 步骤: 1. 使用uni.chooseImage选择多张图片。 2. 获取临时文件路径数组。 3. 将每个文件路径通过uni.uploadFile上传。 注意:uni.uploadFile需要配置url、filePath、name(服务器端接收的文件字段名)等参数。 我们将分别用三种方式实现: 方式一:使用Promise.all(并发上传,不控制并发数,适用于少量图片) 方式二:使用for循环逐个上传(串行,不会超过并发限制,但慢) 方式三:自定义并发控制(例如限制最多同时上传3个) 由于UniApp环境限制,我们不使用外部库,自己实现并发控制。 下面分别给出代码示例。 首先,选择图片的代码: </think> ### Uniapp 中使用 `uni.uploadFile` 实现多张图片上传Uniapp 中,`uni.uploadFile` 一次只能上传单个文件。要实现多图上传,需要结合 `uni.chooseImage` 选择多张图片后,**循环调用 `uni.uploadFile` 或使用 `Promise.all` 并发上传**。以下是详细方案: #### 方案一:使用 `Promise.all` 并发上传(推荐) ```javascript // 选择并上传多张图片 async function uploadMultipleImages() { try { // 1. 选择图片 const res = await uni.chooseImage({ count: 9, // 最多选择9张 sourceType: ['album', 'camera'], // 相册和相机 sizeType: ['compressed'] // 压缩图 }); const tempFilePaths = res.tempFilePaths; // 获取临时路径数组 // 2. 并发上传所有图片 const uploadTasks = tempFilePaths.map(filePath => { return new Promise((resolve, reject) => { uni.uploadFile({ url: 'https://your-api-domain.com/upload', // 替换为实际接口 filePath: filePath, name: 'file', // 后端接收的字段名 formData: { userId: '123', // 附加表单数据 token: uni.getStorageSync('token') }, success: (uploadRes) => { const data = JSON.parse(uploadRes.data); resolve(data.url); // 返回服务器存储的URL }, fail: (err) => reject(err) }); }); }); // 3. 等待所有图片上传完成 const imageUrls = await Promise.all(uploadTasks); console.log('上传成功:', imageUrls); uni.showToast({ title: `上传成功,共${imageUrls.length}张` }); // 4. 处理返回的URL数组(如提交表单) // ...你的业务逻辑 } catch (err) { console.error('上传失败:', err); uni.showToast({ title: '上传失败', icon: 'none' }); } } ``` #### 方案二:顺序上传(避免并发限制) ```javascript // 顺序上传(避免小程序并发限制) async function sequentialUpload() { const res = await uni.chooseImage({ count: 9 }); const tempFilePaths = res.tempFilePaths; const uploadedUrls = []; for (const filePath of tempFilePaths) { try { const url = await new Promise((resolve, reject) => { uni.uploadFile({ url: 'https://your-api-domain.com/upload', filePath, name: 'file', success: (res) => resolve(JSON.parse(res.data).url), fail: reject }); }); uploadedUrls.push(url); } catch (err) { console.error(`图片上传失败: ${filePath}`, err); } } console.log('已上传:', uploadedUrls); } ``` ### 关键代码说明 1. **`uni.chooseImage`** - 选择图片并返回临时路径数组 `tempFilePaths` - 参数 `count` 控制最多选择数量(微信小程序上限9张) 2. **`uni.uploadFile`** - `url`: 服务器接口地址 - `filePath`: 图片临时路径 - `name`: 后端接收文件的字段名(如SpringBoot中用 `@RequestParam("file")`) - `formData`: 附加的POST表单数据 3. **并发控制** - `Promise.all` 实现并行上传(效率高) - 循环中使用 `await` 实现顺序上传(兼容性好) 4. **错误处理** - `try/catch` 捕获异常 - 单张失败不影响其他图片上传 ### 后端注意事项(示例) ```java // SpringBoot 接收文件示例 @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file, @RequestParam String userId) { String url = storageService.save(file); // 保存文件到OSS或本地 return "{\"url\":\"" + url + "\"}"; // 返回JSON格式URL } ``` ### 常见问题解决 1. **多图上传卡顿** - 使用图片压缩(如 `sizeType: ['compressed']`) - 分批次上传(每次3-4张) 2. **安卓/iOS兼容性** - iOS 路径需去掉 `file://` 前缀(Uniapp 已自动处理) - 安卓确保权限声明:`<android-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>` 3. **上传类型限制** - 后端校验文件头(如通过 `magic number` 识别真实文件类型) ---
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值