Vue.js实现文件上传压缩优化处理技巧

目录
  • vue js实现文件上传压缩优化处理
  • 借助canvas的封装的文件压缩上传
    • 1.新建imgUpload.js
    • 2.全局引入封装的方法
    • 3.页面中使用
  • 使用compressorjs第三方插件实现
    • 1.compressorjs安装
    • 2.方法封装
    • 3.页面使用
    • 4.头像上传处理

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

两种方法 :

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

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

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

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

<canvas>简单实例如下:

<canvas id="myCanvas" width="200" height="100"></canvas>

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

使用 style 属性来添加边框:

<canvas id="myCanvas" width="200" height="100"
style="border:1px solid #000000;">
</canvas>

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.length
    let 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方法也是一样的使用方式

<van-uploader :after-read="afterCard" :before-read="beforeRead" accept="image/*" class="arrart"
                :max-size="10240 * 1024" @oversize="onOversize" ref="uploadFile">
                <!-- <div class="loadingWrap" v-show="personCardloading">
                  <van-loading class="colorCom uploadText" color="#fff" size="24px">{{uploadText}}</van-loading>
                </div> -->
                <van-image class="iconImg" round :src="Personal.iconUrl?$baseImgUrl+Personal.iconUrl:require('../../assets/img/touciang.png')" width="64" height="64" />
              </van-uploader>

限制上传数量

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

禁用文件上传

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

<van-uploader 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,可按照如下操作

示例:

<input type="file" id="file" accept="image/*"> 
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度问题

3.页面使用

import ImageCompressor from '@/utils/ImageCompressor'

4.头像上传处理

这里记得使用 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,可按照如下操作

示例:

<input type="file" id="file" accept="image/*"> 
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);
    },
  });

});

到此这篇关于Vue.js实现文件上传压缩优化处理的文章就介绍到这了,更多相关vue文件上传内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue.js 实现图片本地预览 裁剪 压缩 上传功能

    以下代码涉及 Vue 2.0 及 ES6 语法. 目标 纯 javascrpit 实现,兼容ie9及以上浏览器,在本地做好文件格式.长宽.大小的检测,减少浏览器交互. 现实是残酷的,为了兼容Ie9 还是用上了 flash,第二篇来解释解释. 代码结构 <div id="wrap"> <label> 点我上传图片 <input type='file' @change="change" ref="input"> &

  • Vue+Element-UI实现上传图片并压缩

    Vue+Element-UI 上传图片并压缩,供大家参考,具体内容如下 1.版本 Vue:2.5.2 Element-UI:2.12.0 可实现图片上传前,自动压缩. Element-UI组件,详情见 官网. 2.template部分 <el-form-item label="照片"> <el-upload accept="image/*" class="avatar-uploader" :action="upload

  • Vue.js 2.0 移动端拍照压缩图片预览及上传实例

    在学习和使用Vue.js 2.0 的过程中遇到不少不一样的地方,本来移动端开发H5应用,准备将mui框架和Vue.js+vue-router+vuex 全家桶结合起来使用,但是在拍照上传的实现过程中遇到了无法调用plus的H5+接口的问题,所以最后拍照上传功能还是使用input file方式里解决的.但是内心还是不甘心的,由于项目进度推进,迭代版本,所以不得不放弃,后续可能我将此功能使用调用H5+接口实现. 首先我来讲我实现这个拍照预览压缩上传的思路,准确的说应该是拍照或选择图片压缩之后预览及上

  • Vue移动端实现图片上传及超过1M压缩上传

    本文实例为大家分享了Vue移动端实现图片上传及超过1M压缩上传的具体代码,供大家参考,具体内容如下 1.实现效果 2.代码 Html: <div class="choosePic"> <div class="pics" :style="{backgroundImage: 'url(' + form.erpRecords + ')'}"> <input type="file" class="

  • 移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能

    面向百度开发 html <van-uploader :after-read="onRead" accept="image/*"> <img src="./icon_input_add.png" /> </van-uploader> js data() { return { files: { name: "", type: "" }, headerImage: null,

  • Vue 图片压缩并上传至服务器功能

    本文主要讲解基于 Vue + Vant ,实现移动端图片选择,并用 Canvas 压缩图片,最后上传至服务器.还会封装一个工具类,方便直接调用. 一.工具类封装 废话不多说先上代码,封装一个 CompressImageUtils 工具类: ** * 图片压缩工具类 * 最大高度和最大宽度都为 500,如果超出大小将等比例缩放. * * 注意可能出现压缩后比原图更大的情况,在调用的地方自己判断大小并决定上传压缩前或压缩后的图到服务器. */ // 将base64转换为blob export fun

  • 基于vue+axios+lrz.js微信端图片压缩上传方法

    业务场景 微信端项目是基于Vux + Axios构建的,关于图片上传的业务场景有以下几点需求: 1.单张图片上传(如个人头像,实名认证等业务) 2.多张图片上传(如某类工单记录) 3.上传图片时期望能按指定尺寸压缩处理 4.上传图片可以从相册中选择或者直接拍照 遇到的坑 采用微信JSSDK上传图片 在之前开发的项目中(mui + jquery),有使用过微信JSSDK的接口上传图片,本想应该能快速迁移至此项目.事实证明编程没有简单的事: 1.按指定尺寸压缩图片 JSSDK提供的接口wx.choo

  • Vue.js实现文件上传压缩优化处理技巧

    目录 vue js实现文件上传压缩优化处理 借助canvas的封装的文件压缩上传 1.新建imgUpload.js 2.全局引入封装的方法 3.页面中使用 使用compressorjs第三方插件实现 1.compressorjs安装 2.方法封装 3.页面使用 4.头像上传处理 vue js实现文件上传压缩优化处理 两种方法 : 第1种是借助canvas的封装的文件压缩上传 第2种(扩展方法)使用compressorjs第三方插件实现 下面来详细介绍两种方法: 借助canvas的封装的文件压缩上

  • Node.js实现文件上传

    在工作中碰到了这样的需求,需要用nodejs 来上传文件,之前也只是知道怎么通过浏览器来上传文件, 用nodejs的话, 相当于模拟浏览器的行为. google 了一番之后, 明白了浏览器无非就是利用http协议来给服务器传输数据, 具体协议就是<RFC 1867 - Form-based File Upload in HTML>, 在浏览器上通过form 表单来上传文件就是通过这个协议,我们可以先看看浏览器给服务端发送了什么数据, 就可以依葫芦画瓢的把上传功能实现出来.说起form 表单上传

  • 又拍云 Node.js 实现文件上传、删除功能

    Node.js 服务端 使用 Node.js + Express.js 实现 服务端 const express = require("express"); const app = express(); const axios = require('axios'); app.set('port', process.env.PORT || 8082); // 静态资源目录,这里放在了根目录,生产环境不允许这样 app.use(express.static(__dirname)); //

  • elementui+vue+axios实现文件上传本地服务器

    本文实例为大家分享了elementui+vue+axios实现文件上传本地服务器的具体代码,供大家参考,具体内容如下 文件上传的原理 加入文件上传的依赖 <!--文件上传的依赖-->     <dependency>       <groupId>commons-fileupload</groupId>       <artifactId>commons-fileupload</artifactId>       <versio

  • js实现文件上传表单域美化特效

    一款效果非常时尚的文件上传表单域美化特效,下面给出制作的简要教程. 先上几个效果饱饱眼福: 使用方法 这些文件上传域的美化使用的方法都是隐藏原生的<input type="file">元素,然后使用一个<label>元素来制作美化效果.  HTML结构 该文件上传域美化效果最基本的HTML结构如下: <input type="file" name="file" id="file" class=&q

  • JS多文件上传的实例代码

    废话不多说了,具体实现代码如下所示: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script src="./jquery-1.9.1.min.js"></script> </head> <body> <fo

  • js 实现文件上传样式详情

    目录 1.概述 2.创建对象的参数 3.监听例子 4.使用方法 5.源代码 1.概述 这个js包括按钮样式,列表样式.带有删除.添加.放大(使用的是自带的放大功能,提供有API来放入你的弹窗来进行展示) 可监听的事件 Value wdaasd onlargeClickCallBack 如果想使用自己的弹窗,只需要监听这个函数,拿到返回值给你的弹窗的img->href进行赋值即可 imgFile对象(包括这个被点击图片的全部信息)that(这个js的全局唯一对象,可以在这里面拿到你所有的值) on

  • 原生JS实现文件上传

    本文实例为大家分享了JS实现文件上传的具体代码,供大家参考,具体内容如下 一.目的: 实现上传图片功能 二.效果: 三.思路: 用input标签自带的上传,先隐藏掉,给上传按钮添加点击事件,绑定input的点击事件 四.代码: //html <input ref="img-upload-input" class="img-upload-input" type="file" accept=".png, .jpg" @cha

  • PHP 文件上传后端处理实用技巧方法

    PHP 文件上传后端处理实用技巧方法 引语:在上一篇文章中说到,在页面中可以用隐藏的方式让你的上传页面看起来漂亮.但是这对于性能来说,并没有什么卵用,那么在后台的处理中,难道就没有一些处理技巧么?所谓后台的技巧,应该要包括上传得快一点,上传的文件大一点!那么,本文就来说说,后端处理都有些什么技巧吧! 业务场景一.我们只会选择一个单个的文件上传,而且不需要做一些即时的验证工作.那么,也许并没有什么优化可言了,因为,最后你要做的,只是将这个文件放在表单里最后一起提交,直接处理即可! 业务场景二.需要

  • php文件上传后端处理小技巧

    本文就来说说,php文件上传后端处理都有些什么技巧吧! 业务场景一.我们只会选择一个单个的文件上传,而且不需要做一些即时的验证工作.那么,也许并没有什么优化可言了,因为,最后你要做的,只是将这个文件放在表单里最后一起提交,直接处理即可! 业务场景二.需要上传多个文件,而且需要时时验证文件内部内容,并时行相应页面显示.对于这种况,在用户选择了上传文件之后,我们需要立即将文件上传,因为我们需要读取文件里的信息,在最后提交的时候,我们也需要提交一次文件.很明显,在这里是存在一个重复上传的工作的,一个耗

随机推荐