uniapp组件uni-file-picker中对上传的图片进行压缩至1兆以内(推荐)

目录
  • 解决方法:
    • 一、先开启uni-file-picker组件里对于压缩图片的配置项 sizeType,默认是有两个选项的:
    • 二、将图片再次进行压缩,压缩至1兆以下,再传至服务器中:

我在做uniapp项目时,用的uni-file-picker组件,这是我做的一个项目实例,主要是将图片通过接口传至后台服务器

如果只是上传一张照片的话 还没有什么大问题,但是如果一连上传很多个图片,像我这个项目一样,而且有的图片特别大,我这边遇到一个上传照相机的照片就有10兆多,有的手机内存不足,临时空间不够,就会出现白屏的情况。

解决方法:

一、先开启uni-file-picker组件里对于压缩图片的配置项 sizeType,默认是有两个选项的:

  • original :正常
  • compressed:压缩

这是组件源码里显示传参的参考:

sizeType: {
	type: Array,
	default () {
		return ['original', 'compressed']
	}
},

所以在调用uni-file-picker组件时,就可以进行设置,如下:

<uni-file-picker  v-model="mentouValue" return-type="object"
fileMediatype="image" mode="grid" :sourceType="sourceType"
:sizeType="sizeType" :auto-upload="false"
@select="mentouSelect" @delete="mentouDelete"/>

:sizeType="sizeType" 表示的是压缩图片的设置
data中设置sizeType的值:

export default {
    data() {
        return{
            mentouValue:{},          //图片value值
            sizeType:['compressed'], //设置图片压缩
            sourceType:['camera'],   //这里设置的是只能使用照相机,不能从相册里传照片
        }
    },
}

通过以上设置,可以实现对图片进行压缩 一般是对半压缩的,比如5兆压缩成2.5兆左右这样的。
如何进行检验:本地是检验不出来的,需要拿手机进行真机调试,才可以看出来文件压缩后的大小

如果对图片大小没有太大限制 ,直接这样压缩就可以了,但是有的项目会限制对图片的大小必须小于1兆,这时候,光有这个设置,就满足不了需求了,这时候我们可以再采取一点措施

二、将图片再次进行压缩,压缩至1兆以下,再传至服务器中:

1、先创建一个方法imageCompress,一般单独放在公共函数里

// 图片压缩递归,小于1M跳出
export function  imageCompress(file){
	return new Promise((resolve, reject)=>{
		let { size,path } = file
		let type  = path.split(".")[1]
		//大于1M进行压缩,
		if(size< (1024*1024)){
			resolve(file)
			return false
		}
		uni.compressImage({
			src: path,
			quality: 80,
			success: res => {
				let newPath = res.tempFilePath+type
				let newName = res.tempFilePath.split("/")[res.tempFilePath.split("/").length-1]+type
				uni.getFileInfo({
					filePath:res.tempFilePath,
					success:async (info)=>{
						let newFile = {...file,size:info.size,path:newPath,name:newName,tempFilePath:res.tempFilePath}
						resolve(await imageCompress(newFile))
					}
				})
			}
		})

	})

}

2、调用uni-file-picker组件的页面中,调用该方法,然后再上传图片

import { imageCompress } from "@/utils/index.js"
import { baseUrl } from "@/utils/request"
export default {
    data() {
        return{
            mentouValue:{},          //图片value值
            sizeType:['compressed'], //设置图片压缩
            sourceType:['camera'],   //这里设置的是只能使用照相机,不能从相册里传照片
            file:{},
            type:'',
            workId:''
        }
    },
    onLoad(option) {
		this.workId = option.workId
	},
    methods:{
        //选择照片
        mentouSelect(e){
			this.timeSeting()
			if(e.tempFilePaths&&e.tempFiles){
				this.file = e.tempFiles[0].file
                this.type = 'mentou'
				this.toUpload()
			}
		},

        // 删除照片
		mentouDelete(e){
			this.mentouValue = {}
		},

        // 上传照片
        async toUpload(){
			// 压缩图片
			this.file = await imageCompress(this.file)
            // 要传的参数
			let params = {
				file:this.file,
				type: this.type,
				workId:this.workId
			}
			// 上传图片到相依的接口
			uni.uploadFile({
				url: baseUrl+'/app/uploadImage', //这里为拼接的接口地址
				filePath: this.file.tempFilePath?this.file.tempFilePath:this.file.path,
				fileType: "image",
				formData:{...params},
				name: 'file',
				header: {
					'content-type': 'multipart/form-data',
				    "Authorization": uni.getStorageSync('Authorization'),
					"refToken": uni.getStorageSync('refToken')
				},
				success: uploadFileRes => {
					let imageName = JSON.parse(uploadFileRes.data).data
                    // 这里可以对返回的参数进行处理了
					uni.showToast({ title: '上传成功', icon: "success" });
				},
				fail(err) {
					uni.showToast({ title: '上传失败', icon: "error" });
				}
			})
		},

    }
}

这样写完后,图片就会被压缩至1兆以下,然后再传给后端了,亲测有效哦

到此这篇关于uniapp组件uni-file-picker中对上传的图片进行压缩至1兆以内的文章就介绍到这了,更多相关uniapp压缩图片上传内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • uniapp组件uni-file-picker中设置使用照相机和相册权限的操作方法

    在写uniapp项目中,对于上传图片有时会有这样的需求:只可使用照相机拍摄上传,不可使用相册. 在uniapp中,我们通常会使用uni-file-picker这个组件,但是这个组件中,有点缺陷,就是没有对这个功能的传值设置,这里就要给组件进行修改了. 1.在uni-file-picker组件中的uni-file-picker.vue中的js部分,找到props添加一个变量,如下: props: { ....以上省略 sizeType: { type: Array, default () { re

  • uniapp组件uni-file-picker中对上传的图片进行压缩至1兆以内(推荐)

    目录 解决方法: 一.先开启uni-file-picker组件里对于压缩图片的配置项 sizeType,默认是有两个选项的: 二.将图片再次进行压缩,压缩至1兆以下,再传至服务器中: 我在做uniapp项目时,用的uni-file-picker组件,这是我做的一个项目实例,主要是将图片通过接口传至后台服务器 如果只是上传一张照片的话 还没有什么大问题,但是如果一连上传很多个图片,像我这个项目一样,而且有的图片特别大,我这边遇到一个上传照相机的照片就有10兆多,有的手机内存不足,临时空间不够,就会

  • 利用javascript/jquery对上传文件格式过滤的方法

    复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <style><!-- .errorInfo{ color:red; padding-left:5px; } --></style><s

  • Net core中使用System.Drawing对上传的图片流进行压缩(示例代码)

    目录 直接压缩图片 通过文件流压缩图片 上传到七牛云前压缩图片 部署问题 在Linux中安装 产生原因 解决方案 由于net core 中默认没有System.Drawing,可以通过nuget下载一个来代替System.Drawing.Common 直接压缩图片 /// <summary> /// 图片压缩 /// </summary> /// <param name="sFile">原图片位置</param> /// <para

  • vue中使用input[type="file"]实现文件上传功能

    注意:input[type="file"] 标签中的属性accept="application/msword,application/pdf" 在pc上正常,但是在手机ios和android上这个文件格式限制会被忽略,所以需要在js中增加格式的判断,以及对应显示样式的设置.(我也是刚发现,如果有遇到这个问题的可以参考下---下面有更改:) ``` <template> <div id="my-careers"> <h

  • vue中路由传参以及跨组件传参详解

    路由跳转 this.$router.push('/course'); this.$router.push({name: course}); this.$router.go(-1); this.$router.go(1); <router-link to="/course">课程页</router-link> <router-link :to="{name: 'course'}">课程页</router-link> 路由

  • 用fileupload组件实现的大文件上传简单实例

    1.FileUploadServlet.java文件,实现上传处理 import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.text.DecimalFormat; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servl

  • node.js(express)中使用Jcrop进行图片剪切上传功能

    需求说明 简单来说就是要实现用户上传头像,并且要保存用户裁切后的部分作为用户头像. 第一步,选择图片: 第二步,在弹窗页面中展现并进行裁切: 第三步,点击"保存",上传服务器. 实现过程 说来有点坎坷,相当于做了2遍,走了弯路. 第1遍是用户一选择图片,就进行了上传,然后返回一个地址,所以在弹层上展现的图片已经是服务器上的图片了,然后进行裁切,再保存. 第2遍找到的一个方法,是在第1遍做到裁切处理时候想到的,即弹层展现的是用户机器上选择的图片,不用先上传,但是用image/base64

  • Bootstrap中的fileinput 多图片上传及编辑功能

    大家如果对Bootstrap-fileinput 的配置不清楚的话,大家可以查看官方网站:http://plugins.krajee.com/file-input. 逻辑说明:先从后台获取数据展示,然后进行编辑. 废话不多说, 直接上代码. 1. 页面部分代码: <div class="form-group"> <label for="inputEmail3" class="col-xs-3 control-label">

  • yii2中使用webuploader实现图片上传的实战项目

    图片上传几乎是应用必备,前面也针对 kartik 的 fileinput做了一篇详细的说明,不过很多人反馈各种问题,下面针对 webuploader 的使用单独写了一个组件.该组件可以更好的处理 Yii2 在图片上传过程中带来的一系列问题,目前支持多图多字段多modal的混合上传. 介绍之前我们先演示下效果. 安装 推荐使用composer进行安装 $ php composer.phar require bailangzhan/yii2-webuploader dev-master 使用 par

随机推荐