uniapp选择图片压缩并上传

首先呢!需要知道上传图片的一个实现逻辑是怎样的。

选择图片——获取图路径——压缩图片——上传获取图片链接

图片上传使用的是view图片上传:

Upload 上传 | uView 2.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架

图片压缩使用的是插件库的(支持h5):

图片压缩 - DCloud 插件市场

选择图片

			afterRead(event){ //获取图片地址
				console.log(event.file) 
				let files = event.file.map(e=>{ //选择一张或多张时处理
					return e.url
				})
				this.compress(files)  //压缩的方法
			},

获取图片并压缩

			compress(files){//图片压缩并上传
				const that =this
				let compressFile = []
				files.forEach(e=>{  //循环压缩并上传
					that.$refs.wCompress.start(e, { //调用压缩组件方法
							// pixels: 630000,  // 最大分辨率,默认二百万
					        quality: 0.8,     // 压缩质量,默认0.8     
					        base64: true,     // 是否返回base64,默认false,非H5有效
					    })
					.then(res => {
					    // console.log(res) //base64格式
						this.uploadFile(res) //调用上传方法
					})
					.catch(e => {
					    console.log(e)
					})
				})
			},

上传获取图片链接

			uploadFile(blobUrl){ //上传获取图片链接
				const that =this
				let url = { //回显格式所以处理了下
					url:blobUrl
				}
				uni.showLoading({title: '上传中'})
					uni.uploadFile({
						url: that.urlA,// 上传地址
						filePath:blobUrl,
						name: 'file',
						header:that.header,
						formData: {
							'safety': 'question'
						},
						success: (res) => {
							let data = JSON.parse(res.data); //解析照片数据格式
							console.log(data)
							if(data.code == 10000){
								that.fileList1.push(url) //成功后回显
								that.imgurl.push(data.data) // 链接地址
								uni.hideLoading();
							}else{
								uni.hideLoading();
								that.$api.msg(`${data.message}`)
							}
						}
				});
			},

以下是整个文件

<template>
	<view class="">
		<w-compress ref='wCompress' />
		<u-upload :fileList="fileList1" @afterRead="afterRead"
			@delete="deletePic" name="1" multiple :maxCount="3" >
		</u-upload>
	</view>
</template>

<script>
	import WCompress from '@/components/w-compress/w-compress.vue'
	export default{
		data(){
			return {
				urlA: '------------', //假的地址
				header:{
					bigDataToken : 'Bearer' + ' ' + uni.getStorageSync('Token'),
					proToken : 'Bearer' + ' ' + uni.getStorageSync('proToken')
				},
				fileList1: [],
				imgurl:[]
			}
		},
		methods:{
			afterRead(event){ //获取图片地址
				console.log(event.file) 
				let files = event.file.map(e=>{ //选择一张或多张时处理
					return e.url
				})
				this.compress(files)  //压缩的方法
			},
			deletePic(e){ //删除图片
				console.log(e.index)
				this.imgurl.splice(e.idnex,1)
				this.fileList1.splice(e.index,1)
			},
			compress(files){//图片压缩并上传
				const that =this
				let compressFile = []
				files.forEach(e=>{  //循环压缩并上传
					that.$refs.wCompress.start(e, { //调用压缩组件方法
							// pixels: 630000,  // 最大分辨率,默认二百万
					        quality: 0.8,     // 压缩质量,默认0.8     
					        base64: true,     // 是否返回base64,默认false,非H5有效
					    })
					.then(res => {
					    // console.log(res) //base64格式
						this.uploadFile(res) //调用上传方法
					})
					.catch(e => {
					    console.log(e)
					})
				})
			},
			uploadFile(blobUrl){ //上传获取图片链接
				const that =this
				let url = { //回显格式所以处理了下
					url:blobUrl
				}
				uni.showLoading({title: '上传中'})
					uni.uploadFile({
						url: that.urlA,// 上传地址
						filePath:blobUrl,
						name: 'file',
						header:that.header,
						formData: {
							'safety': 'question'
						},
						success: (res) => {
							let data = JSON.parse(res.data); //解析照片数据格式
							console.log(data)
							if(data.code == 10000){
								that.fileList1.push(url) //成功后回显
								that.imgurl.push(data.data) // 链接地址
								uni.hideLoading();
							}else{
								uni.hideLoading();
								that.$api.msg(`${data.message}`)
							}
						}
				});
			},
		}
	}
</script>

<style>
</style>

效果图:

 

 

UniApp是一个基于Vue.js的跨平台框架,它允许开发者构建一次,部署到多个平台的应用,包括H5网页。当需要在H5页面中压缩图片并上传至后台服务器,你可以按照以下步骤操作: 1. **图片压缩**: - 使用JavaScript库,如`html2canvas`配合`canvas-to-blob`或`sharp`等工具,先将图片转为Base64编码的Data URL,然后通过第三方库如`compressible`或自定义算法对数据进行压缩。 ```javascript import compressImage from 'compressible'; async function compress(imgData) { const compressedImg = await compressImage(imgData, { quality: 0.8 }); return compressedImg.data; } ``` 2. **上传到服务器**: - 创建FormData,将压缩后的图片作为formData的一部分。 - 发起POST请求到后端API,通常使用fetch、axios或者其他HTTP客户端库。 ```javascript async function uploadCompressedImage(compressedImgData) { const formData = new FormData(); formData.append('image', compressedImgData, 'compressedImage.jpg'); try { const response = await axios.post('/api/upload', formData); // 处理服务器返回的数据 console.log(response.data); } catch (error) { console.error(error); } } ``` 3. **整合到页面**: - 用户选中图片后,触发压缩上传的函数。 ```html <input type="file" @change="onFileChange"> <button @click="uploadCompressedImage">上传</button> ``` ```javascript methods: { onFileChange(e) { const file = e.target.files[0]; if (file) { // 图片读取转换为blob const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { this.uploadCompressedImage(reader.result); }; } } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值