diff --git a/src/views/index/vehicleAdd.vue b/src/views/index/vehicleAdd.vue
index b9e8d8d5..8b8347a0 100644
--- a/src/views/index/vehicleAdd.vue
+++ b/src/views/index/vehicleAdd.vue
@@ -23,7 +23,7 @@
@delete="vehicleLicenseFrontDelete"
max-count="1"
:preview-size="54"
- accept="image "
+ accept="image/*"
/>
@@ -37,7 +37,7 @@
@delete="vehicleLicenseBackDelete"
max-count="1"
:preview-size="54"
- accept="image "
+ accept="image/*"
/>
@@ -51,7 +51,7 @@
@delete="vehicleLicenseCarPhotoDelete"
max-count="1"
:preview-size="54"
- accept="image "
+ accept="image/*"
/>
@@ -65,7 +65,7 @@
@delete="vehicleFrontPhotoDelete"
max-count="1"
:preview-size="54"
- accept="image "
+ accept="image/*"
/>
@@ -795,6 +795,18 @@ export default {
onOversize() {
this.$toast(`文件大小不能超过5M`)
},
+ // 将 base64 dataURL 转为 Blob,用于 APP WebView 只返回 content 的场景
+ dataURLToBlob(dataURL) {
+ const arr = dataURL.split(',');
+ const mime = arr[0].match(/:(.*?);/)[1];
+ const bstr = atob(arr[1]);
+ let n = bstr.length;
+ const u8arr = new Uint8Array(n);
+ while (n--) {
+ u8arr[n] = bstr.charCodeAt(n);
+ }
+ return new Blob([u8arr], { type: mime });
+ },
blobToDataURL(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
@@ -864,14 +876,42 @@ export default {
});
},
async compressFileItem(fileItem, maxSize = 5 * 1024 * 1024) {
- const rawFile = fileItem.file;
- console.log('rawFile',rawFile)
+ let rawFile = fileItem?.file;
+ const rawContent = fileItem?.content;
+
+ // 打印可序列化的基础信息,VConsole 中对象会显示为空,但 name/size/type 能看到
+ console.log('rawFile info:', {
+ name: rawFile?.name,
+ size: rawFile?.size,
+ type: rawFile?.type,
+ constructor: rawFile?.constructor?.name
+ });
+ console.log('rawContent prefix:', typeof rawContent === 'string' ? rawContent.slice(0, 60) : rawContent);
+
+ // 部分 APP WebView 返回的文件对象异常或为空,但 content 是 base64,此时用 content 兜底
+ if ((!rawFile || !(rawFile instanceof File) || rawFile.size === 0) &&
+ typeof rawContent === 'string' && rawContent.startsWith('data:')) {
+ try {
+ const blob = this.dataURLToBlob(rawContent);
+ const ext = blob.type === 'image/png' ? 'png' : 'jpg';
+ rawFile = new File([blob], `upload_${Date.now()}.${ext}`, { type: blob.type || 'image/jpeg' });
+ console.log('fallback file from content, size:', rawFile.size);
+ } catch (e) {
+ console.error('content to file error:', e);
+ throw new Error('文件解析失败,请重新上传');
+ }
+ }
+
+ if (!rawFile) {
+ throw new Error('未获取到文件,请重新上传');
+ }
+
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 fileName = (rawFile.name || 'image').replace(/\.[^.]+$/, '') + '.jpg';
const compressedFile = new File([blob], fileName, { type: 'image/jpeg' });
fileItem.file = compressedFile;
fileItem.size = compressedFile.size;
@@ -895,7 +935,12 @@ export default {
this.vehicleLicenseFront = res.data;
await this.vehicleOcrHandler();
} catch (e) {
- this.onOversize();
+ console.error('upload compress error:', e);
+ if (e && e.message === '超过5M') {
+ this.onOversize();
+ } else {
+ this.$toast(e && e.message ? e.message : '上传失败,请重试');
+ }
}
},
async vehicleLicenseBackHandler(file) { // 上传 行驶证副页
@@ -912,7 +957,12 @@ export default {
this.vehicleLicenseBack = res.data;
await this.vehicleBackOcrHandler();
} catch (e) {
- this.onOversize();
+ console.error('upload compress error:', e);
+ if (e && e.message === '超过5M') {
+ this.onOversize();
+ } else {
+ this.$toast(e && e.message ? e.message : '上传失败,请重试');
+ }
}
},
async vehicleLicenseCarHandler(file) { // 上传 行驶证车辆照片
@@ -927,7 +977,12 @@ export default {
let res = await uploadImage(formData);
this.vehicleLicenseCarPhoto = res.data;
} catch (e) {
- this.onOversize();
+ console.error('upload compress error:', e);
+ if (e && e.message === '超过5M') {
+ this.onOversize();
+ } else {
+ this.$toast(e && e.message ? e.message : '上传失败,请重试');
+ }
}
},
async vehicleFrontPhotoHandler(file) { // 上传 车头照
@@ -943,7 +998,12 @@ export default {
this.vehicleFrontPhoto = res.data;
await this.ocrCarFrontHandler()
} catch (e) {
- this.onOversize();
+ console.error('upload compress error:', e);
+ if (e && e.message === '超过5M') {
+ this.onOversize();
+ } else {
+ this.$toast(e && e.message ? e.message : '上传失败,请重试');
+ }
}
},
vehicleLicenseFrontDelete() { // 删除 行驶证首页