H5中Vant上传多张图片在beforeRead之后压缩手动上传

看了好多个文章总结出来的一个便捷方法。

这里也是参考了这位大佬给的灵感

利用image-conversion 插件直接对图片进行压缩。

下面是使用步骤

效果图

1.安装插件

npm i image-conversion --save

2.在页面引入

import * as imageConversion from 'image-conversion'

3.具体使用方式

1.引入组件
 <van-uploader v-model="fileList" accept="image/*"
 :before-read="beforeRead"
 @change="handleChange"
 @delete="beforeDelete"
 :max-count="6"
 :multiple="true"
 preview-size="85px"
 :after-read="afterRead" />
  data() {
    return {
      fileList: []
}
}
 2.在before-read中对图片压缩
    beforeRead(file) {
//如果开启的是多个图片上传就用这个循环压缩
      if (file instanceof Array) {
        return new Promise(async (resolve, reject) => {
          let newarr = []
          // 500是控制压缩大小的 根据你自己的需要调整 数值越小压缩越小
          for (const i in file) {
            console.log('压缩前', file[i]) // 压缩到400KB,大于400KB的图片都会进行压缩,小于则不会
            const res = await imageConversion.compressAccurately(file[i], 300)
            const newfile = new File([res], file[i].name, { type: res.type, lastModified: Date.now() })
            newarr[i] = newfile
          }
          resolve(newarr)
        })
      } else {
//单个就用这个
        return new Promise((resolve, reject) => {
          console.log('压缩前', file) // 压缩到400KB,大于400KB的图片都会进行压缩,小于则不会
          // 500是控制压缩大小的 根据你自己的需要调整 数值越小压缩越小
          imageConversion.compressAccurately(file, 300).then(res => {
            res = new File([res], file.name, { type: res.type, lastModified: Date.now() })
            console.log('压缩后', res)
            resolve(res)
          })
        })
      }
    },
3.最后上传附件到后端
 async savefiles(id, fileList) {
      // 保存附件
      return new Promise(async (resolve, reject) => {
          //这里是防止详情里的url再次上传
        if (fileList.length == 0) {
          resolve()
        }
        for (const file of fileList) {
          if (this.$devTools.isNullorUndefined(file.id)) {
            const formData = new FormData()
            formData.append('file', file.file)
        //这个是模拟的接口
            const res = await uploadFileServlet(this.tablename, id, formData)
          }
        }
        resolve()
      })
    },