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() { // 删除 行驶证首页