vue压缩图片上传

<div class="upload_bar">
      <div class="upload_box">
        <input
          type="file"
          class="load_input"
          accept="image/gif, image/jpeg, image/jpg, image/png"
          @change="changeImage(0,'.upload_img','pre_img','pay_image',$event)"
        />
        <div class="icon_box">
          <i class="iconfont iconjia1"></i>
          <p class="my_gray">请选择凭证截图</p>
        </div>
      </div>
      <div class="img_box">
        <img id="upload_img" class="load_img" :src="pre_img" alt />
      </div>
    </div>
import { mychangeImg } from "@/lib/utils.js";
export default {
  data() {
    return {
      // 预览的图片
      pre_img: "",
      // 上传的图片
      uploadimg: ""
    };
  },
  methods: {
     async changeImage(ind, upclass, preupname, e) {
      let res = await mychangeImg(this, ind, upclass, preupname, e,1);
      this.uploadimg = res.file_path;
    },
   
  },
}

utils.js

/**
 * 上传图片
 * @param _this  //vue实例
 * @param ind // class下标
 * @param upclass // 上传的class
 * @param preupname // 预览的变量
 * @param e // $event
 */
export const mychangeImg = (_this, ind, upclass, preupname, e,ctype) => {
    return new Promise((resolve) => {
        var that = _this;
        var img = document.querySelectorAll(upclass);
        var canvas = document.createElement("canvas");
        var file = e.target.files[0];
        if (file) {
            var render = new FileReader();
            render.readAsDataURL(file);
            render.onload = function (e) {
                that[preupname] = e.target.result;
                img[ind].onload = function () {
                    var w = img[ind].naturalWidth;
                    var h = img[ind].naturalHeight;
                    let aspect = w / h;
                    if (w >= 720) {
                        w = 720
                    }
                    h = (w / aspect).toFixed(0);
                    canvas.width = w;
                    canvas.height = h;
                    var ctx = canvas.getContext("2d");
                    ctx.drawImage(img[ind], 0, 0, w, h);
                    var base64 = canvas.toDataURL("image/jpeg", 0.92);
                    var myImg = convertBase64UrlToBlob(base64);
                    var formData = new FormData();
                    formData.append("file", myImg, "image.png");
                        //调用接口
                        uploadPay(formData).then(res => {
                            if (res.data.code == 200) {
                                let _res = res.data.data;
                                resolve(_res)
                                Toast({
                                    message: res.data.msg,
                                    duration: 1000
                                });
    
                            }
                        });
                }
            }
        }
    })
}


/**
 * base64转blob对象
 * @param urlData  //url地址
 */
export const convertBase64UrlToBlob = (urlData) => {
    var arr = urlData.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {
        type: mime
    });
}

formData.append添加文件必须加后缀名作为第三个参数;

如有不足,请见谅,并告诉我最优解决方法,我是小白

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中实现图片压缩上传的方法如下: 1.引入插件:首先需要引入一个图片压缩上传的插件,例如`vue-image-compressor`。 2.安装插件:使用npm或yarn安装插件,命令如下: ``` npm install vue-image-compressor ``` 或 ``` yarn add vue-image-compressor ``` 3.导入插件:在需要使用的组件中导入插件,并注册到Vue实例中,示例代码如下: ```javascript import Vue from 'vue' import VueImageCompressor from 'vue-image-compressor' Vue.use(VueImageCompressor) ``` 4.编写模板代码:在组件模板中添加一个文件上传按钮,并绑定一个`@change`事件来处理文件选择,示例代码如下: ```html <template> <div> <input type="file" @change="handleFileUpload" /> </div> </template> ``` 5.编写处理方法:在组件的`methods`选项中编写处理文件上传的方法,首先获取选择的文件,然后使用插件提供的压缩方法进行压缩,最后使用压缩后的图片进行上传,示例代码如下: ```javascript methods: { handleFileUpload(event) { const file = event.target.files[0] this.$compressImage(file, { quality: 0.6, // 压缩质量,范围为0到1(可选,默认为0.6) maxWidth: 800, // 最大宽度(可选,默认为800) maxHeight: 800 // 最大高度(可选,默认为800) }) .then(compressedImage => { // 进行图片上传逻辑 }) .catch(error => { // 处理压缩失败的情况 }) } } ``` 在上述代码中,通过`this.$compressImage`来调用插件提供的压缩方法,传入的参数为选择的文件和一些可选的压缩参数。压缩成功后,会返回一个压缩后的图片,可以将其直接上传到服务器,或者进行其他的操作。 通过以上步骤,在Vue中实现了图片压缩上传的功能。注意,使用插件的具体使用方法可能会根据插件的不同而有所不同,请根据实际情况进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值