热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue实现文件上传压缩优化处理

vuejs实现文件上传压缩优化处理两种方法:第1种是借助canvas的封装的文件压缩上传第2种(扩展方法)使用compressorjs

vue js实现文件上传压缩优化处理

两种方法 :


  • 第1种是借助canvas的封装的文件压缩上传
  • 第2种(扩展方法)使用compressorjs第三方插件实现

目录

vue js实现文件上传压缩优化处理

 借助canvas的封装的文件压缩上传

1.新建imgUpload.js

2.全局引入封装的方法

3.页面中使用

 使用compressorjs第三方插件实现

1.compressorjs安装

2.方法封装

2.页面使用

3.头像上传处理



下面来详细介绍两种方法:


 借助canvas的封装的文件压缩上传


封装之前,先要对canvas相关的方法有所了解 

简单实例如下:

注意: 标签通常需要指定一个id属性 (或者其他), width 和 height 属性定义的画布的大小.

使用 style 属性来添加边框:

style="border:1px solid #000000;">

1.新建imgUpload.js

 将base64转换为file文件

const dataURLtoFile = (dataurl, filename) => { let arr = dataurl.split(',')let mime = arr[0].match(/:(.*?);/)[1]let bstr = atob(arr[1])let n = bstr.lengthlet u8arr = new Uint8Array(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}return new File([u8arr], filename, { type: mime })
};

使用canvas的方法实现(拓展)

drawImage() 方法在画布上绘制画布。

在画布上定位图像:

context.drawImage(img,x,y);

在画布上定位图像,并规定图像的宽度和高度:剪切图像,并在画布上定位被剪切的部分:

context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

canvas的toDataURL()方法是返回一个包含图片展示的 数据URL。可以使用type 参数其类型,默认为 png 格式 

canvas.toDataURL(type, option);

option表示0到1之间的取值,选定图片的质量,默认值是0.92 

const imgZip = (file) => {let imgZipStatus = new Promise((resolve, reject) => {let canvas = document.createElement("canvas"); // 创建Canvas对象(画布)let context = canvas.getContext("2d");let img = new Image();img.src = file.content; // 指定图片的DataURL(图片的base64编码数据)var Orientation = '';img.onload = () => {// canvas.width = 400;// canvas.height = 300;canvas.width = img.width;canvas.height = img.height;context.drawImage(img, 0, 0, canvas.width, canvas.height); file.content = canvas.toDataURL(file.file.type, 0.5); // 0.92为默认压缩质量let files = dataURLtoFile(file.content, file.file.name);resolve(files)}})return imgZipStatus;
};

导出方法imgZip

export {imgZip
}

2.全局引入封装的方法

main.js

// 引入imgUpload方法
import * as imgUpload from "./utils/imgUpload"
Vue.prototype.$imgUpload = imgUpload;

3.页面中使用

这里使用了vant ui框架,实现的头像上传,如果用原生的input file方法也是一样的使用方式

限制上传数量

通过 max-count 属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域。

禁用文件上传

通过 disabled 属性禁用文件上传。

 限制上传大小图片

// 限制上传大小图片onOversize(file) {console.log(file, "file");this.$toast("文件大小不能超过 10M");},

上传之前的图片验证 

// 上传之前的图片验证beforeRead(file) {console.log(file, "file,123");if (this.$utils.isImage(file.name)) {return true;} else {this.$toast("请上传图片格式");}},

afterCard方法,当提交了头像,先进行压缩处理,再去把formData文件流 作为参数调用接口,

获取到后台返回的图片路径,再调用更新头像接口,把获取的数据赋值显示头像的img.

// 头像上传afterCard(file) {this.$imgUpload.imgZip(file).then(resData => {const formData = new FormData();formData.append("file", resData);// 请求接口上传图片到服务器uploadImg(formData).then(res => {console.log(res, "图片上传");if (res.code == 200) {console.log(res.data,"res.data")let params = {bbsIconUrl: res.data,userId: this.id};compileUserInfo(params).then(resImg => {console.log(resImg, "resImg");if (resImg.code == 200) {this.Personal.iconUrl =res.data;this.$toast("头像修改成功");} else {this.$toast(resImg.msg);}}).catch(error => {});} else {this.$toast(res.msg);}});});},


 如果这里使用原生的input file,可按照如下操作


示例:

import axios from 'axios';document.getElementById('file').addEventListener('change', (e) => {const file = e.target.files[0];if (!file) {return;}this.$imgUpload.imgZip(file).then(resData => {const formData = new FormData();formData.append("file", resData);//接口调用axios.post('/upload', formData).then((res) => {console.log('Upload success');});})});


 使用compressorjs第三方插件实现


compressorjs 是一个开源的图片处理库,提供了图片压缩、图片旋转等能力

语法:

new Compressor(file[, options]) 


1.compressorjs安装


npm install compressorjs --save

2.方法封装

ImageCompressor.js

quality:quality || 0.6, //压缩质量,图片压缩比 0-1

import Compressor from 'compressorjs';
export default function ImageCompressor(file, backType, quality) {return new Promise((resolve, reject) => {new Compressor(file, {quality:quality || 0.6, //压缩质量success(result) {if (!backType || backType == 'blob') {resolve(result)} else if (backType == 'file') {resolve(file)} else {resolve(file)}// resolve(result);},error(err) {console.log("图片压缩失败");reject(err);}})})
}

 此插件还能解决ios移动端拍照图片翻转90度问题


2.页面使用

import ImageCompressor from '@/utils/ImageCompressor'

3.头像上传处理

这里记得使用 async await,注意使用的file取值,与第一种的方法有所不同

// 头像上传async afterCard(file) {let newFile = await ImageCompressor(file.file, 'file', 0.6); //图片压缩const formData = new FormData();formData.append("file", newFile);uploadImg(formData).then(res => {if (res.code == 200) {this.centerInfo.iconUrl = res.data;let params = {iconUrl: res.data,id: this.id,loginType: this.loginType};updateMineIconUrl(params).then(resImg => {console.log(resImg, "resImg");if (resImg.code == 200) {this.$toast("头像修改成功");} else {this.$toast(res.msg);}}).catch(error => {});} else {this.$toast(res.msg);}});},

如果这里使用原生的input file,可按照如下操作


示例:

import axios from 'axios';
import Compressor from 'compressorjs';document.getElementById('file').addEventListener('change', (e) => {const file = e.target.files[0];if (!file) {return;}new Compressor(file, {quality: 0.6,success(result) {const formData = new FormData();formData.append('file', result, result.name);//接口调用axios.post('/upload', formData).then(() => {console.log('Upload success');});},error(err) {console.log(err.message);},});});


⭐️⭐️⭐️  作者:船长在船上
🚩🚩🚩  主页:来访地址船长在船上的博客
🔨🔨🔨  简介:CSDN前端领域博客专家,CSDN前端领域优质创作者,资深前端开发工程师,专注web前端领域开发,在CSDN分享工作中遇到的问题以及问题解决方法和对项目开发的实际案例总结以及新技术的认识。



推荐阅读
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 今天周六,原则上要休息,但想到下周还有一堆任务,还是先做一部分工作吧,就把之前做的票面设计器改了改,增加了上传图片和更换背景底图的功能。现在打算整理下这个设计器,也算对齐一个总结。不过这属于我们部门的 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • ➜~tarzxfsuperset-0.18.2.tar.gzgzip:stdin:notingzipformattar:Childreturnedstatu ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
mobiledu2502887897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有