看了好多个文章总结出来的一个便捷方法。
这里也是参考了这位大佬给的灵感
利用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() }) },