CRM_26-07-21#story#8995,调度app上传行驶证自动压缩

This commit is contained in:
2026-07-13 13:55:28 +08:00
parent e7bb5a23be
commit fd080aa39b

View File

@@ -21,8 +21,6 @@
v-model="vehicleLicenseFrontList" v-model="vehicleLicenseFrontList"
:after-read="vehicleLicenseFrontHandler" :after-read="vehicleLicenseFrontHandler"
@delete="vehicleLicenseFrontDelete" @delete="vehicleLicenseFrontDelete"
@oversize="onOversize"
:max-size="5 * 1024 * 1024"
max-count="1" max-count="1"
:preview-size="54" :preview-size="54"
accept="image " accept="image "
@@ -37,8 +35,6 @@
v-model="vehicleLicenseBackList" v-model="vehicleLicenseBackList"
:after-read="vehicleLicenseBackHandler" :after-read="vehicleLicenseBackHandler"
@delete="vehicleLicenseBackDelete" @delete="vehicleLicenseBackDelete"
@oversize="onOversize"
:max-size="5 * 1024 * 1024"
max-count="1" max-count="1"
:preview-size="54" :preview-size="54"
accept="image " accept="image "
@@ -53,8 +49,6 @@
v-model="vehicleLicenseCarPhotoList" v-model="vehicleLicenseCarPhotoList"
:after-read="vehicleLicenseCarHandler" :after-read="vehicleLicenseCarHandler"
@delete="vehicleLicenseCarPhotoDelete" @delete="vehicleLicenseCarPhotoDelete"
@oversize="onOversize"
:max-size="5 * 1024 * 1024"
max-count="1" max-count="1"
:preview-size="54" :preview-size="54"
accept="image " accept="image "
@@ -69,8 +63,6 @@
v-model="vehicleFrontPhotoList" v-model="vehicleFrontPhotoList"
:after-read="vehicleFrontPhotoHandler" :after-read="vehicleFrontPhotoHandler"
@delete="vehicleFrontPhotoDelete" @delete="vehicleFrontPhotoDelete"
@oversize="onOversize"
:max-size="5 * 1024 * 1024"
max-count="1" max-count="1"
:preview-size="54" :preview-size="54"
accept="image " accept="image "
@@ -803,33 +795,153 @@ export default {
onOversize() { onOversize() {
this.$toast(`文件大小不能超过5M`) this.$toast(`文件大小不能超过5M`)
}, },
blobToDataURL(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (e) => resolve(e.target.result);
reader.onerror = () => reject(new Error('读取压缩图片失败'));
reader.readAsDataURL(blob);
});
},
compressImage(file, maxSize = 5 * 1024 * 1024) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (e) => {
const img = new Image();
img.onload = () => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const originWidth = img.width;
const originHeight = img.height;
const tryQuality = (quality = 0.9) => {
canvas.width = originWidth;
canvas.height = originHeight;
ctx.clearRect(0, 0, originWidth, originHeight);
ctx.drawImage(img, 0, 0, originWidth, originHeight);
canvas.toBlob((blob) => {
if (!blob) return reject(new Error('压缩失败'));
if (blob.size <= maxSize || quality <= 0.1) {
if (blob.size <= maxSize) {
resolve(blob);
} else {
tryResolution();
}
return;
}
tryQuality(quality - 0.1);
}, 'image/jpeg', quality);
};
const tryResolution = (scale = 0.9, quality = 0.8) => {
const width = Math.floor(originWidth * scale);
const height = Math.floor(originHeight * scale);
canvas.width = width;
canvas.height = height;
ctx.clearRect(0, 0, width, height);
ctx.drawImage(img, 0, 0, width, height);
canvas.toBlob((blob) => {
if (!blob) return reject(new Error('压缩失败'));
if (blob.size <= maxSize || scale <= 0.1) {
if (blob.size <= maxSize) {
resolve(blob);
} else {
reject(new Error('超过5M'));
}
return;
}
tryResolution(scale - 0.1, quality);
}, 'image/jpeg', quality);
};
tryQuality();
};
img.onerror = () => reject(new Error('图片加载失败'));
img.src = e.target.result;
};
reader.onerror = () => reject(new Error('文件读取失败'));
reader.readAsDataURL(file);
});
},
async compressFileItem(fileItem, maxSize = 5 * 1024 * 1024) {
const rawFile = fileItem.file;
if (rawFile.size <= maxSize) return rawFile;
const blob = await this.compressImage(rawFile, maxSize);
if (blob.size > maxSize) {
throw new Error('超过5M');
}
const fileName = rawFile.name.replace(/\.[^.]+$/, '') + '.jpg';
const compressedFile = new File([blob], fileName, { type: 'image/jpeg' });
fileItem.file = compressedFile;
fileItem.size = compressedFile.size;
fileItem.content = await this.blobToDataURL(blob);
const mb1 = (compressedFile.size / 1024 / 1024).toFixed(2);
console.log(`压缩后为:${mb1}M`)
return compressedFile;
},
async vehicleLicenseFrontHandler(file) { // 上传 行驶证首页 async vehicleLicenseFrontHandler(file) { // 上传 行驶证首页
const formData = new FormData(); try {
formData.append("file" , file.file); const uploadFile = await this.compressFileItem(file);
let res = await uploadImage(formData) if (uploadFile.size > 5 * 1024 * 1024) {
this.vehicleLicenseFront = res.data; this.onOversize();
await this.vehicleOcrHandler(); return;
}
const formData = new FormData();
formData.append("file" , uploadFile);
let res = await uploadImage(formData)
this.vehicleLicenseFront = res.data;
await this.vehicleOcrHandler();
} catch (e) {
this.onOversize();
}
}, },
async vehicleLicenseBackHandler(file) { // 上传 行驶证副页 async vehicleLicenseBackHandler(file) { // 上传 行驶证副页
this.vehicleLicenseBackOcrFlag = true; try {
const formData = new FormData(); this.vehicleLicenseBackOcrFlag = true;
formData.append("file" , file.file); const uploadFile = await this.compressFileItem(file);
let res = await uploadImage(formData); if (uploadFile.size > 5 * 1024 * 1024) {
this.vehicleLicenseBack = res.data; this.onOversize();
await this.vehicleBackOcrHandler(); return;
}
const formData = new FormData();
formData.append("file" , uploadFile);
let res = await uploadImage(formData);
this.vehicleLicenseBack = res.data;
await this.vehicleBackOcrHandler();
} catch (e) {
this.onOversize();
}
}, },
async vehicleLicenseCarHandler(file) { // 上传 行驶证车辆照片 async vehicleLicenseCarHandler(file) { // 上传 行驶证车辆照片
const formData = new FormData(); try {
formData.append("file" , file.file); const uploadFile = await this.compressFileItem(file);
let res = await uploadImage(formData); if (uploadFile.size > 5 * 1024 * 1024) {
this.vehicleLicenseCarPhoto = res.data; this.onOversize();
return;
}
const formData = new FormData();
formData.append("file" , uploadFile);
let res = await uploadImage(formData);
this.vehicleLicenseCarPhoto = res.data;
} catch (e) {
this.onOversize();
}
}, },
async vehicleFrontPhotoHandler(file) { // 上传 车头照 async vehicleFrontPhotoHandler(file) { // 上传 车头照
const formData = new FormData(); try {
formData.append("file" , file.file); const uploadFile = await this.compressFileItem(file);
let res = await uploadImage(formData); if (uploadFile.size > 5 * 1024 * 1024) {
this.vehicleFrontPhoto = res.data; this.onOversize();
await this.ocrCarFrontHandler() return;
}
const formData = new FormData();
formData.append("file" , uploadFile);
let res = await uploadImage(formData);
this.vehicleFrontPhoto = res.data;
await this.ocrCarFrontHandler()
} catch (e) {
this.onOversize();
}
}, },
vehicleLicenseFrontDelete() { // 删除 行驶证首页 vehicleLicenseFrontDelete() { // 删除 行驶证首页
this.vehicleLicenseFront = ''; this.vehicleLicenseFront = '';