fix: 支持HEIC格式上传 + 压缩目标调小
Some checks failed
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Successful in 4s
Test / build-check (push) Successful in 3s
PR Preview / test (pull_request) Successful in 5s
Test / e2e-test (push) Failing after 56s
PR Preview / deploy-preview (pull_request) Successful in 1m0s

- HEIC/HEIF格式自动转换为JPEG后压缩
- 压缩目标调小确保不超后端限制(QR/logo 300KB,背景 600KB)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 17:23:58 +00:00
parent 34970fb5e9
commit bec537bad2
3 changed files with 18 additions and 3 deletions

View File

@@ -9,6 +9,7 @@
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"exceljs": "^4.4.0", "exceljs": "^4.4.0",
"heic2any": "^0.0.4",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
"pinia": "^2.3.1", "pinia": "^2.3.1",
"vue": "^3.5.32", "vue": "^3.5.32",
@@ -2871,6 +2872,12 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/heic2any": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/heic2any/-/heic2any-0.0.4.tgz",
"integrity": "sha512-3lLnZiDELfabVH87htnRolZ2iehX9zwpRyGNz22GKXIu0fznlblf0/ftppXKNqS26dqFSeqfIBhAmAj/uSp0cA==",
"license": "MIT"
},
"node_modules/html-encoding-sniffer": { "node_modules/html-encoding-sniffer": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz",

View File

@@ -15,6 +15,7 @@
}, },
"dependencies": { "dependencies": {
"exceljs": "^4.4.0", "exceljs": "^4.4.0",
"heic2any": "^0.0.4",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
"pinia": "^2.3.1", "pinia": "^2.3.1",
"vue": "^3.5.32", "vue": "^3.5.32",

View File

@@ -573,9 +573,16 @@ function checkSquare(base64) {
} }
async function handleUpload(type, event) { async function handleUpload(type, event) {
const file = event.target.files[0] let file = event.target.files[0]
if (!file) return if (!file) return
try { try {
// Convert HEIC/HEIF to JPEG
if (file.name.toLowerCase().match(/\.hei[cf]$/)) {
ui.showToast('正在转换HEIC格式...')
const heic2any = (await import('heic2any')).default
const blob = await heic2any({ blob: file, toType: 'image/jpeg', quality: 0.8 })
file = new File([blob], file.name.replace(/\.hei[cf]$/i, '.jpg'), { type: 'image/jpeg' })
}
let base64 = await readFileAsBase64(file) let base64 = await readFileAsBase64(file)
// QR: check if square, offer to crop // QR: check if square, offer to crop
@@ -590,8 +597,8 @@ async function handleUpload(type, event) {
} }
} }
const maxSize = type === 'bg' ? 1000000 : 500000 const maxSize = type === 'bg' ? 600000 : 300000
const maxDim = type === 'bg' ? 1200 : 800 const maxDim = type === 'bg' ? 1000 : 600
base64 = await compressImage(base64, maxSize, maxDim) base64 = await compressImage(base64, maxSize, maxDim)
const fieldMap = { logo: 'brand_logo', bg: 'brand_bg', qr: 'qr_code' } const fieldMap = { logo: 'brand_logo', bg: 'brand_bg', qr: 'qr_code' }
const field = fieldMap[type] const field = fieldMap[type]