You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:36:02