diff --git a/apps/h5-partner/src/components/OssUploadField.tsx b/apps/h5-partner/src/components/OssUploadField.tsx index 16928f3..84b6990 100644 --- a/apps/h5-partner/src/components/OssUploadField.tsx +++ b/apps/h5-partner/src/components/OssUploadField.tsx @@ -39,6 +39,10 @@ function formatWechatUploadError(e: unknown): string { return msg; } +function shouldFallbackToNativePicker(msg: string): boolean { + return /permission|denied|接口未就绪|signature|JSSDK|签名校验|invalid signature|config:fail|未授权/i.test(msg); +} + function acceptsImages(accept: string) { return accept.includes('image'); } @@ -139,6 +143,7 @@ export default function OssUploadField({ setUploading(true); setError(''); try { + weixinSdk.reset(); await weixinSdk.init(); await enqueueUpload(async () => { const files = await weixinSdk.chooseImages({ @@ -152,6 +157,14 @@ export default function OssUploadField({ if (!files[0]) return; await uploadSelectedFile(files[0]); }); + } catch (e) { + const msg = e instanceof Error ? e.message : '无法打开相册'; + if (/cancel/i.test(msg)) return; + if (shouldFallbackToNativePicker(msg)) { + openNativeFilePicker(); + return; + } + throw e; } finally { setUploading(false); } @@ -173,6 +186,10 @@ export default function OssUploadField({ } catch (e) { const msg = e instanceof Error ? e.message : '无法打开相册'; if (/cancel/i.test(msg)) return; + if (shouldFallbackToNativePicker(msg)) { + openNativeFilePicker(); + return; + } showUploadError(formatWechatUploadError(e)); } return; @@ -208,19 +225,17 @@ export default function OssUploadField({ )} - {!useWechatPicker && ( - { - const file = e.target.files?.[0]; - if (file) void uploadSelectedFile(file); - }} - /> - )} + { + const file = e.target.files?.[0]; + if (file) void uploadSelectedFile(file); + }} + /> {isImage ? (