【问题标题】:AWS Lambda + API integration returning as plain text instead of a downloadable .csvAWS Lambda + API 集成以纯文本形式返回,而不是可下载的 .csv
【发布时间】:2022-02-10 03:06:06
【问题描述】:

我正在使用 Node.js 编写的基本 API lambda 函数与 Api 网关集成,我的目标是从 S3 获取文件作为可下载对象(在本例中为 .csv 文件)。 API 有效,但它在浏览器中以纯文本形式返回,并且数据看起来不像 csv 中的数据。

我没有收到任何错误,所以我不明白我的问题出在哪里。有什么想法吗?谢谢!

这是 node.js 代码:

console.log('Loading function');
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });

exports.handler = async (event, context) => {
const params = {
    Bucket: 'testing-api-lambda-s3-jfr',
    Key: 'sample-file-testing.csv',
};

return new Promise((resolve, reject) => {
  s3.getObject(params, function (err, data) {
    if (err) {
      reject({
        statusCode: 500,
        error: JSON.stringify(err)
      });
    }
  resolve({
    statusCode: 200,
    headers: {
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "text/csv"
    },
    body: data
  });

  });
});
 };

API 网关流:

API 调用返回如下而不是可下载的 .csv 文件:

【问题讨论】:

标签: node.js amazon-web-services api amazon-s3 aws-lambda


【解决方案1】:

将 S3 Buffer 数据转换为 string,即 API Gateway proxy response expects。在响应中返回body: dataString

const dataString = data.Body.toString('utf-8'); // set encoding as necessary

在您的响应中添加Content-Disposition 标头以获得所需的文件下载行为:

'Content-Disposition': 'attachment; filename=download.csv'

【讨论】:

  • 那行不通
  • 什么是响应头?签入开发工具或在 cURL 或 Postman 中发出请求。
  • 返回 OK,标题为 "Access-Control-Allow-Origin: "*" Content-Disposition: "attachment; filename=\"sample-file-testing.csv\"" Content-Type: "text/csv"" 但仍然看到相同的行为而不是可下载的文件
  • 你能在 Content-Disposition 中用inline 代替attachment 试试吗?
  • @fedonev 我在新的私人窗口中打开 URL,同样的事情。我确保我的更改已部署。不幸的是没有工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2020-07-30
  • 2017-04-27
  • 1970-01-01
  • 2023-03-06
  • 2021-03-23
相关资源
最近更新 更多