javascript - 使用 REST API 从 Amazon S3 下载文件

标签 javascript rest amazon-web-services amazon-s3 hapi.js

我有自己的 REST API 可以调用以下载 文件。 (最后,文件可以存储在不同类型的服务器中...Amazon s3,本地等...)

要从 s3 获取文件,我应该使用这种方法:

var url = s3.getSignedUrl('getObject', params);

这会给我一个可下载的调用链接。

现在,我的问题是,当文件来自该链接时,我如何使用我自己的 rest API 下载文件?有没有办法重定向调用?

我正在为我的 REST 服务器使用 Hapi

{
    method: "GET", path: "/downloadFile",
    config: {auth: false},
    handler: function (request, reply) {
        // TODO
        reply({})
    }
},

最佳答案

不是使用重定向来下载所需的文件,而是从 S3 返回一个 unbufferedStream。一个unbufferedStream可以从 AWS-SDK 中的 HttpResponse 返回。这意味着不需要从 S3 下载文件,然后读入,然后让请求者下载文件。

仅供引用,我在 Express 中使用了这种 getObject() 方法并且从未使用过 Hapi,但是我认为我与路由定义非常接近,但希望它能捕获我的本质我正在努力实现。

Hapi.js 路由

const getObject = require('./getObject');

{
    method: "GET", path: "/downloadFile",
    config: {auth: false},
    handler: function (request, reply) {
        let key = ''; // get key from request
        let bucket = ''; // get bucket from request

        return getObject(bucket, key)
          .then((response) => {
            reply.statusCode(response.statusCode);

            response.headers.forEach((header) => {
              reply.header(header, response.headers[header]);
            });

            return reply(response.readStream);
          })
          .catch((err) => {
            // handle err
            reply.statusCode(500);
            return reply('error');
          });
    }
},

获取对象.js

const AWS = require('aws-sdk');
const S3 = new AWS.S3(<your-S3-config>);

module.exports = function getObject(bucket, key) {
  return new Promise((resolve, reject) => {
    // Get the file from the bucket
    S3.getObject({
      Bucket: bucket,
      Key: key
    })
      .on('error', (err) => {            
        return reject(err);
      })
      .on('httpHeaders', (statusCode, headers, response) => {
        // If the Key was found inside Bucket, prepare a response object
        if (statusCode === 200) {
          let responseObject = {
            statusCode: statusCode,
            headers: {
              'Content-Disposition': 'attachment; filename=' + key
            }
          };

          if (headers['content-type'])
            responseObject.headers['Content-Type'] = headers['content-type'];
          if (headers['content-length'])
            responseObject.headers['Content-Length'] = headers['content-length'];

          responseObject.readStream = response.httpResponse.createUnbufferedStream();
          return resolve(responseObject);
        }
      })
      .send();
  });
}

关于javascript - 使用 REST API 从 Amazon S3 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41984750/

相关文章:

ruby-on-rails - 使用 AWS Cloudfront 异步加载 Google map

javascript - Excel数据转成html输出

json - 如何在 Glassfish 4 上创建一个简单的 JSON Jersey 2.x RESTful Web 服务?

匹配ASCII的javascript正则表达式

java - JSON异常: org. json.JSONException:JSONObject ["Name"]未找到

java - 在 RESTful Web 服务中使用 @Consumes(MediaType.APPLICATION_JSON) 时出现问题

java - AWS S3上传图像在部署到EBS时不起作用,但在本地主机SpringBoot(JAVA)中起作用

amazon-web-services - 如何为 AWS Websocket API 网关添加自定义域?

javascript - 无法使用javascript选择html元素

javascript - IE 中不显眼的伪类和属性选择器模拟