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

这篇具有很好参考价值的文章主要介绍了uniapp、uview——图片上传(单图上传、多图上传、多组照片上传、图片回显)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

uView组件的上传功能,单图上传、多图上传等。
官方文档地址:
https://www.uviewui.com/components/upload.html
uniapp、uview——图片上传(单图上传、多图上传、多组照片上传、图片回显)

二、步骤

(一)单图上传

1.效果演示:

只能上传一张,选完之后,上传的按钮消失,当然,如果图片不合适,删掉再换一张,但就是只能上传一张。
uniapp、uview——图片上传(单图上传、多图上传、多组照片上传、图片回显)

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。点击图片可预览。
uniapp、uview——图片上传(单图上传、多图上传、多组照片上传、图片回显)

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>

三、其余补充

uniapp、uview——图片上传(单图上传、多图上传、多组照片上传、图片回显)
如果一个页面上有多处上传,操作也不是很复杂,大家都是共用同一个方法。
uniapp、uview——图片上传(单图上传、多图上传、多组照片上传、图片回显)
整体搬过来用即可。
uniapp、uview——图片上传(单图上传、多图上传、多组照片上传、图片回显)
请求接口的地方需要用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)
		}
	})
},

新上传代码:(多图处理)

<view class="imgBox">
	<u-upload :fileList="fileList" @afterRead="afterRead" @delete="deletePic" :multiple="true" :maxCount="9">
		<image :src="$common.image('/static/talentZone/addImg.png')" mode="aspectFill"  class="fileImg"></image>
	</u-upload>
</view>
data() {
	return {
		// 图片列表
		fileList: []
	}
},
methods: {
	// 图片上传
	//删除图片
	deletePic(e) {
		console.log(e);
		this.fileList.splice(e.index, 1)
	},
	// 新增图片
	async afterRead(event) {
		// 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
		let lists = [].concat(event.file)
		let fileListLen = this.fileList.length
		lists.map((item) => {
			this.fileList.push({
				...item,
				status: 'uploading',
				message: '上传中'
			})
		})
		for (let i = 0; i < lists.length; i++) {
			const result = await this.uploadFilePromise(lists[i].url)
			console.log(result);
			if(result.success){
				let item = this.fileList[fileListLen]
				this.fileList.splice(fileListLen, 1, Object.assign(item, {
					status: 'success',
					message: '',
					url: result
				}))
				fileListLen++
			}else{
				this.fileList.splice(fileListLen, 1)
			}
			
		}
	},
	//上传图片
	uploadFilePromise(url) {
		return new Promise((resolve, reject) => {
			let a = uni.uploadFile({
				url:'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址,换成自己上传图片的接口
				filePath: url,
				name: 'file',
				success: (uploadRes) => {
					setTimeout(()=>{
						let res = JSON.parse(uploadRes.data) //最终传给的是字符串,这里需要转换格式
						if(res.code == 0){
							this.$common.msg(res.msg)
							resolve({success:false,url:''})
							return;
						}
						resolve({success:true,url:res.data.url})
					},2000)
					
				}
			});
		})
	},
	//点击确认还需要些许修改
	fabu() {
		let images = []
		this.fileList.forEach((item) => {
			images.push(item.url.url)
		})
		// 其他接口
		request('post', '其他接口地址', {
			title: this.textValue,
			info: this.textValue,
			images: images.join(',')//重点是这里,需要看后台接收的类型进行更改
		}).then(res => {
			if (res.code == 1) {
				console.log(res);
			}
		})
	},
}

图片上传

// 图片上传
//删除图片
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)
		console.log("结果", result);
		if (result.success) {
			let item = this.fileList[fileListLen]
			this.fileList.splice(fileListLen, 1, Object.assign(item, {
				status: 'success',
				message: '',
				url: result
			}))
			fileListLen++
		} else {
			this.fileList.splice(fileListLen, 1)
		}
	}
},
uploadFilePromise(url) {
	return new Promise((resolve, reject) => {
		let a = uni.uploadFile({
			url: config[config.env].apiUrl + '/api/common/upload', // 仅为示例,非真实的接口地址
			filePath: url,
			name: 'file',
			formData: {
				user: 'test'
			},
			success: (uploadRes) => {
				setTimeout(() => {
					let res = JSON.parse(uploadRes.data) //最终传给的是字符串,这里需要转换格式
					if (res.code == 0) {
						this.$common.msg(res.msg)
						resolve({
							success: false,
							url: ''
						})
						return;
					}
					console.log("图片", res);
					resolve({
						success: true,
						url: res.data.url
					})
				}, 1000)
			}
		});
	})
},

单图传值

data(){
	return{
		payment_credentials:''//支付凭证(线下必填)
	}
},
methods: {
aaa(){
	if (this.fileList.length > 0) {
		this.payment_credentials = this.fileList[0].url.url
	}}
	
}

图片回显

当内容进行修改时,需要先将上次上传过的图片进行显示(后台会返回图片数组),之后或许删除上次中的某种图片,也有可能会新上传一些图片。最后提交给后台的数据的图片数组是不带域名的。
整体步骤如下:

data() {
	return {
		// 图片列表
		fileList: [],
		//修改功能 需要提交的图片数组
		subImg:[]
	}
},
1.修改,根据id 进行查询此条数据的信息,后台返回该条数据信息,这里只说图片的事。首先对images进行处理,字符串转化为数组,之后对分割后的数组subImg进行遍历循环,把图片路径(拼接好域名之后)push到fileList数组里面,这时候页面的图片就能显示了。
this.subImg = res.data.images.split(',') //字符串转化为数组
this.subImg.forEach(item=>{
	console.log(item);
	this.fileList.push({
		url:  this.$common.image(item)//拼接好域名之后push进去
	})
})
console.log(this.fileList);

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

2.由于修改之后提交给后台的图片数组是不带域名的,所以自定义了一个subImg数组,刚上来的时候就已经赋进去了最初始的两张图,如果删除,就根据删除的下标删除掉此数组里面的图片,每次上传新图片的时候,就把新上传后返回的图片路径push进去,这样 不管是删除还是新增都能保证sunImg数组里面的图片都是最新的,且不带域名

核心代码:

this.subImg.splice(e.index, 1)
this.subImg.push(res.data.url)

具体代码:文章来源地址https://www.toymoban.com/news/detail-465125.html

//删除图片
deletePic(e) {
	console.log(e);
	this.fileList.splice(e.index, 1)
	this.subImg.splice(e.index, 1)  //新增删除代码
},
// 新增图片
async afterRead(event) {
	// 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
	let lists = [].concat(event.file)
	let fileListLen = this.fileList.length
	lists.map((item) => {
		this.fileList.push({
			...item,
			status: 'uploading',
			message: '上传中'
		})
	})
	for (let i = 0; i < lists.length; i++) {
		const result = await this.uploadFilePromise(lists[i].url)
		console.log(result);
		if (result.success) {
			let item = this.fileList[fileListLen]
			this.fileList.splice(fileListLen, 1, Object.assign(item, {
				status: 'success',
				message: '',
				url: result
			}))
			fileListLen++
		} else {
			this.fileList.splice(fileListLen, 1)
		}
	}
},
//上传图片
uploadFilePromise(url) {
	return new Promise((resolve, reject) => {
		let a = uni.uploadFile({
			url: config[config.env].apiUrl + '/api/common/upload',
			filePath: url,
			name: 'file',
			success: (uploadRes) => {
				setTimeout(() => {
					let res = JSON.parse(uploadRes.data) //最终传给的是字符串,这里需要转换格式
					if (res.code == 0) {
						this.$common.msg(res.msg)
						resolve({
							success: false,
							url: ''
						})
						return;
					}
					console.log("图片", res.data.url);
					this.subImg.push(res.data.url)  //新增添加代码
					resolve({
						success: true,
						url: res.data.url
					})
				}, 2000)
			}
		});
	})
},

到了这里,关于uniapp、uview——图片上传(单图上传、多图上传、多组照片上传、图片回显)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【uniapp】uview1.x使用upload上传图片

    和2.x不同的是,要用 action 来配置后端上传图片的接口地址; 再来一些配置项的命名有所不同,一般1.x的命名用 - ,2.x的命名使用小驼峰; 1.x 的上传会自带删除时的提示框,2.x 没有; 重要的几个配置项有: picList 初始化为一个空数组,是用来保存图片的列表 baseUrl 为后端上

    2024年02月07日
    浏览(27)
  • springboot+vue2 实现文件上传,vue表单实现上传多张照片或视频回显

    此教程可以实现对上传的文件管理,并加入了我的功能需求,大家可以自行进行修改。 文件管理: 功能需求视频: 文件上传视频(图片和视频) 先来简单介绍下功能实现,实现此功能分为数据库、后端java、前端vue共同实现; 业务流程: vue页面点击上传后,通过调用后端接

    2024年02月04日
    浏览(41)
  • layui选择多张图片上传多图上传到服务器保存

    多图上传在一些特殊的需求中我们经常会遇到,其实多图上传的原理大家都有各自的见解。对于Layui多图上传和我之前所说的通过js获取文本框中的文件数组遍历提交的原理一样,只不过是Layui中的upload.render方法已经帮我们封装好了,我们只管调用即可,也就是说你选中了几张

    2024年02月16日
    浏览(30)
  • 前端上传图片并回显

    先将按钮画出来, input 使用 display: none 隐藏,通过点击按钮触发 input 。 注意: capture=\\\"camera\\\" 表示只能使用拍照,在移动端可以使用。 回显有两种方法,一种是上传到 服务器 ,再将从服务器返回的文件流或图片地址展示出来;另一种是将图片转成 base64 ,再将 base64 展示出来

    2024年02月09日
    浏览(26)
  • element ui 多张图片上传、回显、删除

    前端文件上传 1、展示部分 2、方法部分 3.函数部分 表单提交时的操作 这个写的有点长,大家挑选自己用的到的部分复制修改一下就行 后端文件上传 1.controoler部分

    2024年02月09日
    浏览(29)
  • element upload 图片上传 回显 及删除

    目标需求 图片上传 图片回显 可以删除图片 效果图 实现 模板 js 难点 理解 upload 中的 fileList 这个参数,需要将这个参数存起来回显,以及删除的时候找到对应删除的图片下标

    2024年02月15日
    浏览(30)
  • uniapp下载和上传照片

    利用uniapp开发的时候,需要下载和上传照片,在H5和微信小程序中的写法不一样。 浏览器中下载就是模拟超链接下载。也不需要获取什么权限,比较简单。 小程序下载需要先获取相册权限。 查看微信小程序的设置信息,点击设置进去即可查看,uni.openSetting接口就是会打开这

    2024年02月16日
    浏览(25)
  • Vue中实现图片上传,上传后的图片回显,存储图片到服务器 【使用对象存储OSS】

    前言 以下只提供一种思路,对新手可能不太友好。 这里将前端Vue上传的图片直接存储到服务器上, Alibaba Cloud OSS : 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储

    2024年02月06日
    浏览(49)
  • vue+springboot 上传文件、图片、视频,回显到前端。

    预览: 视频: 分成两部,1.通过前端将文件的基本信息传送到后端进行储存,返回已储存的文件id,2.再将文件发送到后端储存。 储存文件信息 上传文件对象 这个我放在d盘下面,需要修改映射路径

    2023年04月19日
    浏览(46)
  • uniapp中uview组件库的丰富Upload 上传上午用法

    目录 基础用法 #上传视频 #文件预览 #隐藏上传按钮 #限制上传数量 #自定义上传样式 API #Props #Methods #Slot #Events 基础用法 可以通过设置 fileList 参数(数组,元素为对象),显示预置的图片。其中元素的 url 属性为图片路径 #上传视频 通过设置 accept=\\\'video\\\' 属性,将上传改为视频上

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包