Express服务上传PDF至S3桶 无需写磁盘创建可读流方案求助
解决方案
第一步:调整multer存储配置为内存存储
multer默认使用磁盘存储会将上传的文件写入本地磁盘,替换为内存存储即可让文件暂存在内存Buffer中,完全不涉及磁盘读写:
const multer = require('multer'); // 配置内存存储 const storage = multer.memoryStorage(); // 可根据业务需要添加文件大小限制,示例为限制最大10MB const upload = multer({ storage: storage, limits: { fileSize: 10 * 1024 * 1024 } });
第二步:修改上传逻辑
你有两种可选方案上传到S3:
方案1:直接传Buffer(更简洁)
AWS S3 SDK的upload方法的Body参数原生支持Buffer类型,不需要额外转可读流:
router.post('/upload', upload.single('my-pdf'), async (req, res, next) { const file = req.file; const uploadParams = { Bucket: '你的S3桶名称', Key: `自定义存储路径/${file.originalname}`, // 自定义文件在S3上的存储路径和名称 Body: file.buffer, ContentType: file.mimetype // 可选,配置后浏览器访问文件可直接预览无需下载 }; try { const result = await s3.upload(uploadParams).promise(); return res.status(200).json({ url: result.Location }); } catch (err) { next(err); } }
方案2:转可读流上传
如果你需要对流做额外处理(比如压缩、分片等),可以从Buffer生成可读流再传入:
const { Readable } = require('stream'); router.post('/upload', upload.single('my-pdf'), async (req, res, next) { const file = req.file; // 从内存Buffer生成可读流 const fileStream = Readable.from(file.buffer); const uploadParams = { Bucket: '你的S3桶名称', Key: `自定义存储路径/${file.originalname}`, Body: fileStream, ContentType: file.mimetype }; try { const result = await s3.upload(uploadParams).promise(); return res.status(200).json({ url: result.Location }); } catch (err) { next(err); } }
注意事项
- 内存存储会占用服务器运行内存,大文件上传场景建议根据业务上限合理配置文件大小限制,避免出现OOM问题
- 如果你使用的是AWS SDK v3,仅上传方法的调用语法略有差异,核心传参逻辑保持不变即可
内容的提问来源于stack exchange,提问作者SkinnyBetas
相关产品推荐
相关产品推荐

