使用 van-uploader(vant 组件库上传图片组件)上传图片时,
部分 ios 机型,会偶发从手机上传图片后,图片预览中,图片旋转了 90 度的问题。
对于该问题,vant 官网中也给出了解决方案。
但官网中的方案适配的是单选情况下,上传图片时多选图片就会报错。
不论是哪种解决方案,都用到了 Compressor 类,先引入插件。
npm install compressorjs
一 vant 官网解决方案(单选)
首先在元素中加入 before-read 属性,传入 beforeRead 方法。
<van-uploader ... before-read="beforeRead" />
在 beforeRead 方法中使用 Compressor 类对 file 进行校正处理。
...
import Compressor from 'compressorjs';
...
export default {
...
methods: {
beforeRead(file) {
console.log('开始修正')
return new Promise((resolve) => {
new Compressor(file, {
success: resolve,
error(err) {
console.log(err.message);
},
});
})
}
}
}
二 完美解决方案(单选+多选)
首先在还是元素中加入 before-read 属性,传入 beforeRead 方法。
<van-uploader ... before-read="beforeRead" />
在 beforeRead 方法中使用 Compressor 类对 file 进行校正处理,这里有一点变化。
...
import Compressor from 'compressorjs';
...
export default {
...
methods: {
beforeRead(file) {
console.log('开始修正')
return new Promise((resolve) => {
if(!Array.isArray(file)) file = [file]
const filePromiseArr = file.map(item => {
return new Promise((res) => {
new Compressor(item, {
success: res,
error(err) {
console.log(err.message);
},
});
});
})
Promise.all(filePromiseArr).then((res) => {
console.log('修正完毕')
resolve(res)
})
}
}
}
}
三 体验优化
这样就可以了,但是Compressor处理是需要时间的,这时候会导致,从手机中选中图片返回页面后,照片不会立刻出现在预览区域,而是会有几秒钟的空白,这时可以为页面添加toast优化体验。
Toase.loading({
message: '',
forbidClick: true,
});