如何将NestJS中Multer上传的文件直接转为ReadableStream?
直接将Multer上传的Buffer转为ReadableStream(无需写入磁盘)
你已经通过Multer拿到了内存中的文件Buffer(file.buffer),完全不需要写入磁盘再读取,直接用Node.js内置的stream.Readable就能把Buffer转换成可读流。
实现步骤:
- 导入Node.js的Stream模块
在你的Service文件顶部引入Readable:
import { Readable } from 'stream';
- 将Buffer转为ReadableStream
在Service的create方法里,直接用Readable.from()包装文件Buffer:
create(createNewsDto: CreateNewsDto, file: Express.Multer.File) { // 从内存Buffer创建可读流 const fileStream = Readable.from(file.buffer); // 这里可以直接使用fileStream做后续操作,比如上传到OSS、流式处理内容等 // 示例:监听流事件验证 fileStream.on('data', (chunk) => { console.log('读取到数据块大小:', chunk.length); }); fileStream.on('end', () => { console.log('文件流读取完成'); }); return { success: true, message: '文件已转为可读流' }; }
补充说明:
- Multer默认使用
MemoryStorage,会把上传的文件内容存在内存Buffer里,这也是你能拿到file.buffer的原因,整个过程不会碰磁盘。 - 如果需要处理大文件,建议调整Multer的文件大小限制,避免内存溢出:
// 修改你的ApiFile装饰器,添加limits配置 export function ApiFile(fieldName: string) { return applyDecorators( UseInterceptors( FileInterceptor(fieldName, { storage: memoryStorage(), // 显式指定内存存储(默认就是这个) limits: { fileSize: 10 * 1024 * 1024, // 限制最大10MB,按需调整 }, }), ), ); }
- 转换后的
fileStream是标准的Node.js ReadableStream,和通过fs.createReadStream()得到的流用法完全一致,兼容所有支持流式处理的工具。
内容的提问来源于stack exchange,提问作者dante
相关产品推荐
相关产品推荐

