diff --git a/apps/h5-partner/src/components/OssUploadField.tsx b/apps/h5-partner/src/components/OssUploadField.tsx index a958ba2..ac3e11a 100644 --- a/apps/h5-partner/src/components/OssUploadField.tsx +++ b/apps/h5-partner/src/components/OssUploadField.tsx @@ -99,17 +99,24 @@ export default function OssUploadField({ }); }, [useWechatPicker, needsAuth]); - async function uploadSelectedFile(file: File) { - if (file.size > DEFAULT_MAX_MB * 1024 * 1024) { - const text = `文件不能超过 ${DEFAULT_MAX_MB}MB`; - showUploadError(text); + async function persistUpload(file: File) { + if (!file.size) { + showUploadError('图片读取失败,请重新选择'); return; } + if (file.size > DEFAULT_MAX_MB * 1024 * 1024) { + showUploadError(`文件不能超过 ${DEFAULT_MAX_MB}MB`); + return; + } + const result = await uploadFileToOss(file, { bizType, mediaType }); + onChange?.(result.url); + } + + async function uploadSelectedFile(file: File) { setUploading(true); setError(''); try { - const result = await enqueueUpload(() => uploadFileToOss(file, { bizType, mediaType })); - onChange?.(result.url); + await enqueueUpload(() => persistUpload(file)); } catch (e) { showUploadError(e instanceof Error ? e.message : '上传失败'); } finally { @@ -142,14 +149,19 @@ export default function OssUploadField({ try { weixinSdk.reset(); await weixinSdk.init(); + // 选图 + 上传须在同一个队列任务内完成,避免嵌套 enqueueUpload 死锁 await enqueueUpload(async () => { const files = await weixinSdk.chooseImages({ count: 1, sourceType: ['album', 'camera'], }); if (!files?.[0]) return; - await uploadSelectedFile(files[0]); + await persistUpload(files[0]); }); + } catch (e) { + const msg = e instanceof Error ? e.message : '无法打开相册'; + if (/cancel/i.test(msg)) return; + showUploadError(formatWechatUploadError(e)); } finally { setUploading(false); }