示例说明
用 busboy 流式解析 multipart 上传,内存高效处理大文件,带限制。本示例属于文件上传场景,提供可直接复制使用的typescript代码片段,附带边界条件与使用注意事项。
技术要点
- busboy 流式解析不全部缓冲内存
- limits.fileSize 限制单文件大小
- file 事件逐块收集 end 时合并
代码解读
上述代码实现了用 busboy 流式解析 multipart的核心逻辑。用 busboy 流式解析 multipart 上传,内存高效处理大文件,带限制。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。busboy 流式解析不全部缓冲内存,limits.fileSize 限制单文件大小。这些设计确保代码在生产环境中的健壮性。
使用建议
在实际项目中使用本示例时,建议先理解用 busboy 流式解析 multipart的适用场景与限制条件。file 事件逐块收集 end 时合并。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。
代码示例
import Busboy from'busboy';import{Writable}from'node:stream';export function parseMultipart(req:{headers:Record<string,string>},{maxFileSize=10*1024*1024}={}){const busboy=Busboy({headers:req.headers,limits:{fileSize:maxFileSize}});const files:{fieldname:string;filename:string;data:Buffer;}[]=[];const fields:Record<string,string>={};busboy.on('file',(fieldname,file,filename)=>{const chunks:Buffer[]=[];file.on('data',(c)=>chunks.push(c));file.on('end',()=>files.push({fieldname,filename:filename??'',data:Buffer.concat(chunks)}));});busboy.on('field',(name,val)=>{fields[name]=val;});return new Promise<{files:typeof files;fields:typeof fields}>((resolve,reject)=>{busboy.on('finish',()=>resolve({files,fields}));busboy.on('error',reject);req.pipe?.(busboy);});}