uniapp、uview——图片上传(单图上传、多图上传、多组照片上传)

一、简介

uView组件的上传功能,单图上传、多图上传等。
官方文档地址:
https://www.uviewui.com/components/upload.html

二、步骤

(一)单图上传

1.效果演示:

只能上传一张,选完之后,上传的按钮消失,当然,如果图片不合适,删掉再换一张,但就是只能上传一张。
在这里插入图片描述

2.代码:
<template>
	<view class="content">
		<!-- 上传图片 -->
		<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" :multiple="false" :maxCount="1" width="112rpx" height="109rpx" :deletable="true" :previewImage="true">
		    <!-- 这张图片就是自定义的图片,地址填写自己本地的就行 -->
			<image src="/static/function/uploadImg.png" mode="widthFix" style="width: 112rpx;height: 110rpx;"></image>
		</u-upload>
	</view>
</template>

<script>
	export default {
      
      
		data() {
      
      
			return {
      
      
				// 上传图片
				fileList1: [],
			}
		},
		onLoad() {
      
      

		},
		methods: {
      
      
		    //删除图片
			deletePic(e) {
      
      
				console.log(e);
				this[`fileList${ 
        e.name}`].splice(e.index, 1)
			},
			// 新增图片
			async afterRead(event) {
      
      
				console.log(event)
				// 当设置 mutiple 为 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: this.$common.domain+'/api/common/upload', // 仅为示例,非真实的接口地址
						url:'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址
						filePath: url,
						name: 'file',
						formData: {
      
      
							user: 'test'
						},
						success: (res) => {
      
      
							let data=JSON.parse(res.data) //最终传给的是字符串,这里需要转换格式
							resolve(data.data.url)
						}
					});
				})
			},
		}
	}
</script>

<style lang="scss">
</style>

(二)多图上传

1.效果演示:

可一次性选多张,我这里限制为两张,上传满两张则不会显示上传的logo。点击图片可预览。
在这里插入图片描述

2.代码:
<template>
	<view class="content">
		<!-- 上传图片 -->
		<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" :multiple="true" :maxCount="2" width="112rpx" height="109rpx" :deletable="true" :previewImage="true">
		    <!-- 这张图片就是自定义的图片,地址填写自己本地的就行 -->
			<image src="/static/function/uploadImg.png" mode="widthFix" style="width: 112rpx;height: 110rpx;"></image>
		</u-upload>
	</view>
</template>

<script>
	export default {
      
      
		data() {
      
      
			return {
      
      
				// 上传图片
				fileList1: [],
			}
		},
		onLoad() {
      
      

		},
		methods: {
      
      
		    //删除图片
			deletePic(e) {
      
      
				console.log(e);
				this[`fileList${ 
        e.name}`].splice(e.index, 1)
			},
			// 新增图片
			async afterRead(event) {
      
      
				console.log(event)
				// 当设置 mutiple 为 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: this.$common.domain+'/api/common/upload', // 仅为示例,非真实的接口地址
						url:'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址
						filePath: url,
						name: 'file',
						formData: {
      
      
							user: 'test'
						},
						success: (res) => {
      
      
							setTimeout(() => {
      
      
								resolve(res.data.data)
							}, 1000)
						}
					});
				})
			},
		}
	}
</script>

<style lang="scss">
</style>

三、其余补充

在这里插入图片描述
如果一个页面上有多处上传,操作也不是很复杂,大家都是共用同一个方法。
在这里插入图片描述
整体搬过来用即可。
在这里插入图片描述
请求接口的地方需要用join处理一下

getData() {
    
    
	let images=[]
	this.fileList1.forEach((item)=>{
    
    
		images.push(item.url)
	})
	this.$common.request('post', '/Coupon/addCoupon', {
    
    
		image:images.join(','),
	}).then(res => {
    
    
		if (res.code == 1) {
    
    
			this.$common.success(res.msg)
			setTimeout(()=>{
    
    
				this.$common.back()
			},1200)
		}
	})
},

猜你喜欢

转载自blog.csdn.net/xulihua_75/article/details/127206064