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

在Express JS服务器中从S3获取文件并返回给客户端的方法

高效返回S3文件到客户端的方案

在Express结合AWS SDK v3的场景下,最高效的方式是流式传输——直接将S3返回的可读流管道(pipe)到Express响应对象,避免将整个文件加载到内存,大幅提升性能,尤其适合大文件场景。

完整修正后的代码:

const s3 = new S3Client({...})

router.get('/getfile', async (req, res) => { // 必须添加async关键字
  try {
    const data = await s3.send(
      new GetObjectCommand({
        Bucket: 'bucket',
        Key: 'path',
      })
    )

    // 设置响应头,让客户端正确识别文件
    res.setHeader('Content-Type', data.ContentType);
    res.setHeader('Content-Length', data.ContentLength);
    // 如果需要让浏览器触发下载而非直接打开,添加以下头
    // res.setHeader('Content-Disposition', `attachment; filename="your-filename.ext"`);

    // 将S3的可读流直接管道到响应对象,实现流式传输
    data.Body.pipe(res);

    // 监听流错误事件,避免请求挂起
    data.Body.on('error', () => {
      res.status(500).send('文件读取失败');
    });
  } catch (err) {
    // 处理S3请求失败的情况,比如文件不存在、权限不足等
    res.status(404).send('文件不存在');
  }
})

关键细节说明:

  • 流式传输优势:data.Body是AWS SDK返回的ReadableStream,通过pipe(res)可以逐步将数据流发送给客户端,无需在服务器内存中缓存整个文件,内存占用极低,适配各类大小的文件。
  • 响应头设置:传递S3返回的ContentType和ContentLength,能让客户端浏览器正确解析文件类型和下载进度;若需要触发下载行为,添加Content-Disposition头即可。
  • 错误处理:务必捕获S3请求的异常,同时监听流的错误事件,避免请求无响应挂起。
  • async关键字:原代码路由回调缺少async,会导致await语法报错,必须补上。

内容的提问来源于stack exchange,提问作者srinesha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:32:42