From ac5e917f756dac6e76d3bb95402729d13d9c1adb Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Tue, 27 Oct 2026 01:36:34 +0800 Subject: [PATCH] Preserve multipart selection order when uploading multiple assets --- apps/waterfall-wiki/src/pages/api/upload.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/waterfall-wiki/src/pages/api/upload.ts b/apps/waterfall-wiki/src/pages/api/upload.ts index 3fe2111..eb684d1 100644 --- a/apps/waterfall-wiki/src/pages/api/upload.ts +++ b/apps/waterfall-wiki/src/pages/api/upload.ts @@ -19,15 +19,16 @@ export async function upload(req:NextApiRequest,res:NextApiResponse,policy:Uploa try{ sameOrigin(req); const form=formidable({maxFileSize:250*1024*1024,maxTotalFileSize:1024*1024*1024,maxFiles:16,allowEmptyFiles:false}); - form.on('fileBegin',(_name,file)=>temporary.push(file.filepath)); - const [fields,files]=await form.parse(req); + // file completion events can finish out of order; preserve multipart selection order. + const items:File[]=[]; + form.on('fileBegin',(_name,file)=>{temporary.push(file.filepath);items.push(file)}); + const [fields]=await form.parse(req); const assetOnly=z.enum(['true','false']).default('false').parse(fields.assetOnly?.[0])==='true'; const kind=z.enum(['image','video','audio']).parse(policy.validateImage?'image':fields.kind?.[0]); const title=z.string().trim().min(1).max(200).parse(fields.title?.[0]||policy.defaultTitle||(assetOnly?'上传素材':undefined)); const slug=z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).max(120).optional().parse(fields.slug?.[0]); const description=z.string().trim().max(100000).parse(fields.description?.[0]||''); const tagIds=z.array(z.uuid()).max(50).parse(JSON.parse(fields.tags?.[0]||'[]')); - const items=Object.values(files).flat().filter(Boolean) as File[]; if(!items.length) return res.status(400).json({error:'请选择文件'}); const records:{id:string;key:string;mime:string;width:number|undefined;height:number|undefined;duration:number|undefined;hasAudio:boolean|null;size:number;hash:string;filename:string}[]=[]; for(const file of items){