uniapp 图片压缩上传 uni.chooseImage, uni.compressImage uni.upload

思路

  1. uni.chooseImage上传图片
  2. 判断图片的大小
  3. 如果超过了指定大小就使用 un,compressImage,将图片压缩

具体实现

  1. 上传文件返回一个 文件信息的数组list
  2. 创建一个承载promise的数组

  3. 循环 文件信息的数组,创建promise 如果文件的大小大于 2M 就使用 uni.compressImage压缩图片并将压缩的文件resolve出去,如果文件的大小小于2M 就直接将文件信息resolve返回出去

  4. 使用promise.all执行 promise数组 得到 压缩后的文件信息列表 compressList

  5. 调用upload方法

  6. 声明 promise数祖,循环 compressList 创建promise  调用 upload 上传图片,将上传后的图片resolve出去

  7. 使用promse.all 拿到 upload的线上文件信息,添加到最终的数据数组中,传递给后台保存或者渲染

	_chooseImg() {
			console.log('999');
			if (flag == true) {
				return;
			}
			let type_set = ['.png', '.jpg', '.jpeg'];
			uni.chooseImage({
				count: the.maxImg_ - the.imgPaths.length,
				sizeType: ['original', 'compressed'],
				sourceType: ['album', 'camera'],
				extension: type_set,
				success: res => {
					console.log('res-chooseImg', res);
					let fileList = res.tempFiles;
					flag = true;
					if (fileList.length + the.imgPaths.length > the.maxImg_) {
						uni.showToast({
							title: `最多只能上传${the.maxImg_}个图片`,
							icon: 'none'
						});
						return;
					}
					let chooseList = res.tempFiles.map(ele=>ele.path)
					this.imgPaths= this.imgPaths.concat(chooseList)
					this.handleBeforeUpload(res.tempFiles);
				}
			});
		},
		// 图片上传
		imgUpload(tempFilePaths) {
			uni.showLoading({
				title: '上传中'
			});
			console.log('tempFilePaths', tempFilePaths);

			let uploadImgs = [];
			tempFilePaths.forEach((item, index) => {
				uploadImgs.push(
					new Promise((resolve, reject) => {
						console.log('item-000000000', item);
						let fileTypeList = item.split('.');
						let fileType = fileTypeList[fileTypeList.length - 1];
						let nowTime = new Date();
						let year = nowTime.getFullYear();
						let month = nowTime.getMonth() + 1;
						let day = nowTime.getDate();
						let time = nowTime.getTime();
						let filekey = `/img/${year}/${month}/${day}/${time}_${Math.floor(Math.random() * 100)}.${fileType}`;
						console.log('item-000000000filekey', filekey);
						let httpBase = {
							url: base.baseUrl + '/api/file/fileUpload',
							filePath: item,
							name: 'file',
							formData: {
								fileKey: filekey
							},
							header: {
								Authorization: this.handleToken()
							}
						};
						const uploadTask = uni.uploadFile({
							...httpBase,
							success: uploadFileRes => {
								console.log('uploadFileRes', uploadFileRes);
								flag = false;
								resolve(uploadFileRes);
							},
							fail: err => {
								console.log(err);
								flag = false;
								reject(err);
							},
							complete: () => {
								flag = false;
							}
						});
					})
				);
			});
			console.log("uploadImgs1111111111111111111111",uploadImgs)
			Promise.all(uploadImgs) //执行所有需请求的接口
				.then(results => {
					results.forEach(ele=>{
						let fileData = JSON.parse(ele.data).data
						this.resultImgPaths.push(fileData.fileUrl)
					})
					this.$emit("sendPic",this.resultImgPaths)
					uni.hideLoading();
				})
				.catch((res, object) => {
					uni.hideLoading();
				});
		},
	
handleToken() {
			let tokenC = uni.getStorageSync('token');
			return tokenC;
		},
		handleBeforeUpload(tempFilePaths) {
			uni.showLoading({
				title: '压缩中...'
			});
			let compressImgs = [];
			let results = [];
			let normalResults = [];
			tempFilePaths.forEach((item, index) => {
				console.log('item', item);
				let size = item.size / 1024 / 1024;
				if (size >= 1) {
					console.log("999999",size)
					compressImgs.push(
						new Promise((resolve, reject) => {
							uni.compressImage({
								src: item.path,
								quality: 60, // 仅对jpg有效
								success: res => {
									console.log('compressImage', res.tempFilePath);
									results.push(res.tempFilePath);
									resolve(res.tempFilePath);
								},
								fail: err => {
									reject(err);
								},
								complete: () => {}
							});
						})
					);
				} else {
					compressImgs.push(
						new Promise((resolve, reject) => {
							console.log("itemitem0000000000")
								results.push(item.path);
							resolve(item.path);
						})
					);
				}
			});
			console.log("compressImgs4444444444444444444",compressImgs)
			Promise.all(compressImgs) //执行所有需请求的接口
				.then(results => {
					console.log("results",results)
					uni.hideLoading();
					this.imgUpload(results);
				})
				.catch((res, object) => {
					uni.hideLoading();
				});
		},

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用uni.chooseImage方法选择图片后,可以通过获取到的临时文件路径(tempFilePaths)来进行图片上传。需要注意的是,由于uni-app是基于H5的跨平台开发框架,因此不同平台的文件路径是不同的,需要进行兼容处理。 可以使用uni.uploadFile方法进行图片上传,示例代码如下: ```javascript uni.chooseImage({ success: function (res) { var tempFilePaths = res.tempFilePaths; uni.uploadFile({ url: 'http://example.com/upload', // 上传图片的接口地址 filePath: tempFilePaths[0], // 需要上传的图片临时文件路径 name: 'file', // 文件对应的 key,开发者在服务器端通过这个 key 可以获取到文件二进制内容 success: function (uploadRes) { console.log('上传成功', uploadRes); }, fail: function (err) { console.log('上传失败', err); } }); } }); ``` 需要注意的是,uni.chooseImage方法可能会返回多张图片的临时文件路径,需要根据实际需求进行处理。如果需要同时上传多张图片,可以使用Promise.all方法进行并行上传,示例代码如下: ```javascript uni.chooseImage({ count: 2, // 最多可以选择的图片张数,默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: function (res) { var tempFilePaths = res.tempFilePaths; var promiseArr = []; for (var i = 0; i < tempFilePaths.length; i++) { promiseArr.push(uploadImage(tempFilePaths[i])); } Promise.all(promiseArr).then(function (result) { console.log('上传成功', result); }).catch(function (error) { console.log('上传失败', error); }); } }); function uploadImage(filePath) { return new Promise(function (resolve, reject) { uni.uploadFile({ url: 'http://example.com/upload', // 上传图片的接口地址 filePath: filePath, // 需要上传的图片临时文件路径 name: 'file', // 文件对应的 key,开发者在服务器端通过这个 key 可以获取到文件二进制内容 success: function (uploadRes) { resolve(uploadRes); }, fail: function (err) { reject(err); } }); }); } ``` 这样就可以同时上传多张图片,并在所有图片上传完成后进行统一处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值