NodeJS 从 AWS S3 存储桶下载文件

2024-04-05

我正在尝试在 NodeJS/Express 中创建一个端点,用于从我的 AWS S3 存储桶下载内容。

它运行良好,我可以在客户端下载文件,但我也可以在“网络”选项卡中看到流预览,这很烦人......

QUESTION

我想知道我所做的是否正确并且是一个好的做法。 还想知道在“网络”选项卡中看到输出流是否正常。

我应该如何使用 NodeJS/Express 将文件从 S3 正确发送到我的客户端应用程序?

我很确定其他网站请求不允许您预览内容:“无法加载响应数据".


这是我在 NodeJS 应用程序中从 AWS S3 获取流文件的操作:

download(fileId) {
  const fileObjectStream = app.s3
    .getObject({
      Key: fileId
    })
    .createReadStream();
  this.res.set("Content-Type", "application/octet-stream");
  this.res.set(
    "Content-Disposition",
    'attachment; filename="' + fileId + '"'
  );
  fileObjectStream.pipe(this.res);
}

在客户端我可以看到:


我认为问题出在标题上:

          //this line will set proper header for file and make it downloadable in client's browser

          res.attachment(key); 

          // this will execute download 
          s3.getObject(bucketParams)
          .createReadStream()
          .pipe(res);

所以代码应该是这样的(这就是我在项目处理文件中作为 res.attachment 或 res.json 所做的,以防出现错误,以便客户端可以向最终用户显示错误):

router.route("/downloadFile").get((req, res) => {
      const query = req.query; //param from client
      const key = query.key;//param from client
      const bucketName = query.bucket//param from client

      var bucketParams = {
        Bucket: bucketName,  
        Key: key
      };

      //I assume you are using AWS SDK
      s3 = new AWS.S3({ apiVersion: "2006-03-01" });

      s3.getObject(bucketParams, function(err, data) {
        if (err) {
          // cannot get file, err = AWS error response, 
          // return json to client
          return res.json({
            success: false,
            error: err
          });
        } else {
          res.attachment(key); //sets correct header (fixes your issue ) 
          //if all is fine, bucket and file exist, it will return file to client
          s3.getObject(bucketParams)
            .createReadStream()
            .pipe(res);
        }
      });
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeJS 从 AWS S3 存储桶下载文件 的相关文章

  • 在 ES6 Node.js 中导入“.json”扩展名会引发错误

    我们正在尝试使用 Node js 导出和导入 ES6 模块的新方法 对于我们来说 从package json文件 下面的代码应该做到这一点 import name version from package json 但是 执行时会抛出以下错
  • 同位素 Jquery 插件布局问题

    我正在尝试在此站点上设置同位素 它需要处理布局 并且我需要能够将项目附加到容器中 问题是它似乎没有正确初始化图像 这是我初始化它的方法 document ready function var container container cont
  • 尝试在 Windows 上执行 package.json 中的脚本会引发 JScript 错误

    所以我正在尝试构建 javascriptair site 在 的里面package json有一个 npm 脚本指向 javascript 命令 package scripts 找到该存储库https github com kentcdod
  • Ember 模型中的自定义请求 url

    我正在尝试将 Ember 数据与已构建的 REST api 一起使用 它适用于顶级路由 例如我在 api 端有课程路由 如下所示 app get courses app controllers courses findAll app get
  • 封装的闭包与类?

    我是 JS 来自 C etc 的新手 我突然想到闭包似乎是比类更简单 更方便的处理封装的方法 这段代码似乎给出了一种处理封装的简单方法 function addProperty o var value o get function retu
  • JS 是否支持使用键函数而不是比较器进行排序?

    JavaScript 的array sort https developer mozilla org en US docs Web JavaScript Reference Global Objects Array sort Syntax方
  • Chrome DevTools 脚本黑盒不起作用

    我正在尝试使用 chrome devtools 的新功能 黑盒脚本 这篇 Chrome Devtools 文章列出了脚本黑盒功能 https developer chrome com devtools docs blackboxing wh
  • Postman如何发送请求? ajax,同源策略

    我发现了这个非常有用的 Chrome 扩展程序 名为 Postman 这是一个非常有用的扩展 特别是当您正在编写 RESTful 应用程序时 我感到困惑的一件事是这个插件 扩展如何能够在不同的域上成功发送 POST 请求 我尝试像这样使用
  • Amazon S3 下载尝试限制

    我想限制我的 Amazon s3 服务的下载尝试次数为特定数量 我正在使用来自的库http undesign org za http undesigned org za 任何人都知道如何限制下载到特定数量 我的理解是 这种限制是不可能的 无
  • JavaScript 中 == 和 === 的区别[重复]

    这个问题在这里已经有答案了 有什么区别 and 在 JavaScript 中 我也见过 and 运营商 还有更多这样的运营商吗 看看这里 http longgoldenears blogspot com 2007 09 triple equ
  • 设备收到 GCM Android 通知但未显示

    尽管通知已在应用程序本身中注册 但我的 Ionic Android 应用程序的 GCM Cloud 消息通知未出现在我的设备的主屏幕中 我正在使用 npm 模块node gcm https www npmjs com package nod
  • 删除鼠标悬停时的 Vue 自定义过滤器

    我想使用 VueJS 2 删除鼠标悬停时的截断过滤器 这是模板中的过滤器 div class eng word english truncate div 这是过滤器本身 filters truncate function value let
  • 如何从对象 URL 获取文件或 blob?

    我允许用户通过拖放和其他方法将图像加载到页面中 当图像被删除时 我正在使用URL createObjectURL转换为对象 URL 以显示图像 我不会撤销该网址 因为我会重复使用它 所以 当需要创建一个FormData对象 以便我可以允许他
  • Javascript 仅在 Chrome 中打开开发者工具后才起作用

    我和这里有同样的问题 为什么JavaScript只有在IE中打开开发者工具一次后才能工作 https stackoverflow com questions 7742781 why javascript only works after o
  • 监听鼠标事件……除了 div 的溢出:滚动滚动条?

    关于如何监听 mousedown 的任何建议 document exceptdiv 的溢出 滚动滚动条 我不确定滚动条是什么元素is为了参考它 您可以使用以下命令自行检查目标 document on mousedown function e
  • 如何解析使用YUI数据源返回的NULL值

    我正在使用 YUI 数据表和数据源来渲染我的项目之一中的数据 返回的数据恰好为NULL YUI数据源无法解析它 下面是数据源和数据表的声明代码 为了便于阅读 我将每个声明分开 列说明声明 var columnDescription key
  • 反应本机中的“未知命名模块”错误

    我正在使用 React Native 创建一个应用程序 但某些导入会引发标题中的错误 Unknown named module 两个包都会发生这种情况 react native material design and react nativ
  • 如何提交表单 onkeyup 操作

    我正在尝试保存表格onkeyup行动 我是 jQuery 新手 这可能吗 我很感激任何帮助 编辑1 保存表单意味着保存到服务器 有没有办法增加0 2秒的延迟 此代码将在 keyup 上提交您的表单 element bind keyup fu
  • Dojo 是否可以与其他 JS 框架结合?

    我们使用 Dojo 1 9 3 作为构建单页面应用程序的 JS 框架 然而 我们在 Dojo 的怪癖上花费了太多时间 因此即使是简单的任务也需要很长时间才能实现 由于缺乏适当的文档 我们经常不得不求助于阅读源代码 然后实施解决方法 我觉得如
  • 为什么我无法访问多个网络调用的结果?

    在我的 Node 应用程序中 我试图获取包裹的运输数据 我需要一种方法来获取 json 数据并将其附加到对象或其他东西 以便我可以将其传递到我的渲染页面 使用 pug 这是我的代码 var test for var i 0 i lt res

随机推荐

  • Hibernate:如何通过级联插入OnetoMany子级

    我正在尝试保留一个新的 UserTopics 对象 并将新的 UserTopic 映射到与多个 userId 对应的 Topic 表中 我不知道我在这里做错了什么 下面是我的代码和异常 我的 UserTopics 实体 Entity Tab
  • PyQt:QTableWidget获取选定的行号

    我需要获取 QTableWidget 中选定行的行号 如何获取 int 类型的数字 如何使变量随我单击的行而变化 要根据所选行更改变量 您可以连接信号QTableWidget cellClicked row column https doc
  • F# 交互,API 对 dll 引用的限制

    您如何解决类似这样的错误消息 Binding session to C Program Files x86 NLog NET Framework 4 0 NLog dll error FS0193 API restriction The a
  • Jasmine 监视 RxJS 5.5 操作员

    我正在尝试使用 Jasmine 监视 RxJS 操作员 在我的测试中有不同的用例 我希望控制 Observable 返回的内容 为了说明我正在尝试做的事情 我创建了上面的示例 尽管我认为它没有多大意义 因为此可观察值总是返回相同的硬编码字符
  • SonarQube REST API:读取各个项目的指标

    我的问题 我正在使用 SonarQube 7 1 版 并尝试提取与各个项目相关的指标和质量门 我们尝试过什么 在我们公司升级到 7 1 版本之前 我们使用 Python SonarQube API 来提取这些数据 api resources
  • 双倍到十六进制字符串并返回

    在 Java 中将双精度数转换为十六进制字符串相当简单 但我该如何做相反的事情呢 我的代码如下 我已经注意到其中NumberFormatException被抛出 大约 2 3 向下 public class HexToDoubleTest
  • 调整许多 PDF 的大小

    我正在编写的程序有许多 大约 1000 个 多页 PDF 问题在于 其中许多页面大小不一致 即使有时在同一文档中也是如此 有谁知道我可以通过编程方式浏览文件并将页面大小调整为我想要的大小的方法吗 这可以是任何语言 我可以在 Adob e A
  • 用于更改字段的 Java Jackson 注释[重复]

    这个问题在这里已经有答案了 我必须调用第 3 方 API 来获取货币汇率 但返回的 JSON 不断变化 如果我请求MYR to USD转换 它会返回我 MYR USD 0 246731 所以如果我要求KRW to USD 它会返回我 KRW
  • ASP.NET MVC 视图 - 我可以使用代码隐藏吗

    我是 MVC 新手 我注意到视图页面由于所有混合的脚本标签看起来非常糟糕 在视图代码隐藏的方法中生成 HTML 然后将方法的字符串结果作为单个脚本插入 是否有意义 例如 div div 这是否违背MVC理念 由于其他原因 例如性能 而变得愚
  • Swift 上的 +++ 和 <<< 是什么?

    我只是从这个知道github项目 https github com xmartlabs Eureka usage斯威夫特有 and lt lt lt 运营商 我很难在谷歌上搜索这个 因为 and lt lt lt 也许某种特殊字符根本不会出
  • openSSL 的 PKCS#11 引擎

    我正在尝试在 Windows 7 下设置 openSSL 以使用供应商特定的安全模块 我从供应商那里得到了一个 PKCS 11 API dll 比如说vendor dll PKCS 11 引擎是根据https github com Open
  • 多久轮询一次 wifi 信号强度?

    理想情况下 我希望近乎实时地监控无线网络的信号强度 比如每 100 毫秒一次 但如此高的频率可能有点过大了 我正在使用托管无线网络 http managedwifi codeplex com 库轮询 RSSI 我实例化一个WlanClien
  • 如何更改Linux中每个用户的默认最大进程数

    我在更改 Linux 中用户的默认进程数时遇到了问题 我尝试过编辑 etc security limits conf文件并添加以下行 malintha hard nproc 10000 保存后我尝试在终端上执行以下命令 ulimit u 它
  • 固定位置水平滚动条

    我有一个很长的 div 比方说比屏幕长 带有一个水平滚动条 出现在 div 的底部 我希望水平滚动条出现在窗口的底部 而不是出现在 div 的底部 我的情况类似于这把小提琴 http jsfiddle net xaTe9 1 而且我真的无法
  • Spinner:当所选项目保持不变时,不会调用 onItemSelected

    我有一个OnItemSelectedListener for my Spinner 但当所选项目与前一项相同时 不会调用它 显然是OnClickListener不是一个选项Spinner 我需要捕捉用户每次点击某个项目的时间 任何想法 也许
  • 在磁盘上存储密码的安全策略

    我正在构建一套需要定期访问数据库的批处理作业 在 Solaris 10 计算机上运行 由于 不可更改的 设计限制 我们需要使用特定的程序来连接它 该接口要求我们通过命令行传递纯文本密码才能连接到数据库 这是一种糟糕的安全做法 但我们仍坚持这
  • 文件名中 TCL 通配符/glob 的使用

    我有这样的代码 proc myProc first last for set i first i lt last incr i set i cur PlainText i
  • 有没有办法获取特定城市的所有 Facebook 活动?

    我可以获取特定城市的所有 Facebook 活动吗 我所需要的只是事件 ID 没有别的 它应该是所有事件 公共 而不仅仅是某人的事件 Facebook 会让我们获取这些信息吗 Elmcity 对活动标题中的关键字进行简单搜索 例如尝试 兰开
  • 使滚动条仅在将鼠标悬停在 Div 上时可见?

    我试图弄清楚如何拥有一个可滚动的 div 仅在悬停时显示其滚动条 示例是 Google 图片搜索 在下图中 您可以看到左侧边栏在将鼠标悬停在其上方之前似乎无法滚动 这可以通过 CSS 实现还是需要 Javascript 如果可能的话 也许一
  • NodeJS 从 AWS S3 存储桶下载文件

    我正在尝试在 NodeJS Express 中创建一个端点 用于从我的 AWS S3 存储桶下载内容 它运行良好 我可以在客户端下载文件 但我也可以在 网络 选项卡中看到流预览 这很烦人 QUESTION 我想知道我所做的是否正确并且是一个