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

news2024/11/18 7:46:31

我在做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兆以下,然后再传给后端了,亲测有效哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文搞懂ES6的Map

什么是Map Map是ECMAScript 6 的新增特性&#xff0c;是一种新的集合类型&#xff0c;为javascript带来了真正的键/值存储机 制。 Map 对象存有键值对&#xff0c;其中的键可以是任何数据类型。 Map 对象记得键的原始插入顺序。 Map 对象具有表示映射大小的属性。 Map的基…

海康视频WEB插件 V1.5.2 开发总结

文章目录前言一、效果图二、插件使用步骤总结三、具体步骤分析1.new 一个WebControl 插件实例2.启动插件服务3.创建视频播放窗口、绑定消息回调4.初始化参数&#xff0c;其中secret参数需要通过RSA加密&#xff0c;加密公钥通过WebControl.JS_RequestInterface获取5.通过WebCon…

前端使用html2canvas生成图片踩坑

前端使用html2canvas生成图片经验总结 前言 主要是总结一下html2canvas生成图片的基础用法&#xff0c;以及自己在使用html2canvas过程中踩过的坑和相应的解决思路 背景 近段时间接手一个项目&#xff0c;需要向设备下发某一个图片&#xff0c;为了该图片可以实时更改&…

vue实现tagsview多页签导航功能

文章目录前言一、效果图二、实现思路1. 新建 tags-view.js2. 在Vuex里面引入 tags-view.js3. 新建 tabsView 组件4. 新建 ScrollPane 组件5. 引入 tabsView 组件6. 使用 keep-alive 组件&#xff0c;进行页签的缓存总结前言 基本上后台管理系统都需要有多页签的功能&#xff0…

vue 城市选择器(省市区)的使用 element-china-area-data

一、Element UI 中国省市区级联数据 本文参考&#xff1a;Element UI 中国省市区级联数据 本文参考&#xff1a;根据此文做的整理 1. 安装 npm install element-china-area-data -S2. 使用 import { regionData, CodeToText, TextToCode } from element-china-area-datareg…

vue项目打包优化及配置vue.config.js文件(实测有用)

首先我们需要在根目录里创建一个vue.config.js 首先在文件中先写入 //打包配置文件 module.exports {assetsDir: static, // outputDir的静态资源(js、css、img、fonts)目录publicPath: ./, // 静态资源路径&#xff08;默认/&#xff0c;如果不改打包后会白屏&#x…

HTML樱花飘落

樱花效果 FOR YOU GIRL 以梦为马&#xff0c;不负韶华 LOVE YOU FOREVER 实现代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv"…

【JavaScript-动画原理】如何使用js进行动画效果的实现

&#x1f482; 个人主页&#xff1a;Aic山鱼 个人社区&#xff1a;山鱼社区 &#x1f4ac; 如果文章对你有所帮助请点个&#x1f44d;吧!欢迎关注、点赞、收藏(一键三连)和订阅专哦目录 前言 1.动画原理 2.动画函数的封装 3.给不同元素添加定时器 4.缓动动画原理 5.给动…

原生JS实现FlappyBird游戏 超详细解析 快来做一个自己玩吧

目录​ 1.适配设备&#x1f43e; 2.背景滚动&#x1f490; 3.管道的创建与移动&#x1f338; 4.小鸟操作&#x1f337; 5.碰撞检测&#x1f340; 6.触屏事件&#x1f339; 7.制作开始与结束面板&#x1f33b; 8.得分统计&#x1f33a; 我们先来看看接下来我们要做的效果…

vue 路由报错

在进行如下路由跳转时 const edit (index: number) > { let row: any categoryData.value[index]; router.push({ name: “commodityedit”, query: { id: row.id, name: row.name } }); }; 遇到问题如下 TypeError: Failed to fetch dynamically imported module: http…

【uni-app】第三方ui组件推荐引入的方法

ui组件推荐 1. Muse-UI Muse UI 是一套 Material Design 风格开源组件库&#xff0c;旨在快速搭建页面。它基于 Vue 2.0 开发&#xff0c;并提供了自定义主题&#xff0c;充分满足可定制化的需求。material-design-icons 是谷歌定义的一套icontypeface 是谷歌定义的一套字体…

html+css+js制作LOL官网,web前端大作业(3个页面+模拟登录+链接)

文章目录一、效果图1.1首页1.2 模拟登录1.3 游戏资料页面1.4 商城页面二、代码2.1 首页2.2 资料页面2.3 商城页面三、链接一、效果图 1.1首页 1.2 模拟登录 1.3 游戏资料页面 1.4 商城页面 二、代码 2.1 首页 index.html <!doctype html> <html><head>&l…

JavaScript高级 |如何玩转箭头函数?

本文已收录于专栏⭐️ 《JavaScript》⭐️ 学习指南&#xff1a;箭头函数语法规则简写规则常见应用mapfilterreduce箭头函数中的this使用concatthis的查找规则完结散花参考文献箭头函数 在ES6中新增了函数的简写方式----箭头函数&#xff0c;箭头函数的出现不仅简化了大量代码…

Vue3自动引入组件,组件库

在做vue3项目中时&#xff0c;每次使用都需要先进行引入&#xff0c;用ts的还好&#xff0c;会有爆红提示&#xff0c;如果是使用js开发的很多时候都会等到编译的时候才发现哪里哪里又没有引入&#xff0c;就会很浪费时间&#xff0c;偶然发现一款好用的组件可以帮助我们很好的…

【你不知道的 CSS】你写的 CSS 太过冗余,以至于我对它下手了

:is() 你是否曾经写过下方这样冗余的CSS选择器: .active a, .active button, .active label {color: steelblue; }其实上面这段代码可以这样写&#xff1a; .active :is(a, button, label) {color: steelblue; }看~是不是简洁了很多&#xff01; 是的&#xff0c;你可以使用…

详细分析解决Uncaught SyntaxError: Cannot use import statement outside a module (at ...)的错误

文章目录1. 复现错误2. 分析错误3. 解决错误1. 复现错误 今天在学习es6时&#xff0c;启动页面后&#xff0c;却报出如下图错误&#xff1a; 即Uncaught SyntaxError: Cannot use import statement outside a module (at module.html?_ijtvfvtohb23jt1tj3r4ad3a0t82v:19:5)。 …

解决CitSpace分析新版本web of science文献报错“the timing slicing setting is outside the range of your data”

1.问题新版web of science于2021年7月7日上线&#xff0c;旧版 Web of Science 将同步运行到2021年底。现在旧版web of science入口早已关闭&#xff0c;新本web of science的残产品中也不在提供旧页面入口。近来在使用web of science文献制作CiteSpace图谱时发现&#xff0c;w…

【轻松解决el-dialog关闭后数据缓存 没清空】

问题描述 在使用el-dialog的时候&#xff0c;关闭弹窗之后&#xff0c;发现数据还是保存在上面&#xff0c;查资料试了那些方法&#xff0c;都不太行&#xff0c;最后发现以下方法&#xff0c;泪目。 解决方案&#xff1a; 方案一、使用this.resetForm("form")重置…

vue把el-dialog提取出来作为子组件,并实现父组件和子组件相互传值

最近做项目遇到了一个需求是&#xff0c;为了防止组件中代码冗长&#xff0c;需要将el-dialog对话弹出框单独封装成子组件&#xff0c;并将父组件中的id传递给子组件&#xff0c;子组件再根据id刷新父组件。具体项目代码太长&#xff0c;这里仅记录一下实现思路。 01 把el-dial…

vue 基于el-table实现多页多选、翻页回显过程

近半年时间在接触vue写pc页面&#xff0c;文中内容即在实际的开发过程中遇到的实际问题。 1、问题交代&#xff1a; 在pc版的列表页面中&#xff0c;假设当前在列表的第一页&#xff0c;想要在当前页面选择几行数据&#xff0c;跳转到其他页面选择几行数据&#xff0c;选择后…