【问题标题】:AWS Api Gateway & CSV Upload IssueAWS Api Gateway 和 CSV 上传问题
【发布时间】:2021-02-03 04:39:28
【问题描述】:

我在 CSV 的 lambda 函数中获得了一些元信息/垃圾。我需要删除那个垃圾。如果我直接将文件保存到 s3,则包含垃圾。谁能指导我如何删除它?

----------------------------362648820336892682391117   ***// remove this***
Content-Disposition: form-data; name="file"; filename="Book1.csv" ***// remove this***
Content-Type: text/csv ***// remove this***

o;?name,age // remove this o;?
andy,33
hello,34
----------------------------362648820336892682391117--  ***// remove this***

我也可以使用预签名 URL 直接上传到 s3,但这不是我想要的。

const AWS = require('aws-sdk');

exports.handler = async (event) => {
    try {
            console.log(JSON.stringify(event, 2, null));
            const data = new Buffer(event.body, 'base64');
            const text = data.toString('ascii');
            const s3 = new AWS.S3();
            const params = {Bucket: 'bucket', Key: 'key', Body: text};
        const d = await s3.upload(params).promise();
        return {
            statusCode: 200,
            body: JSON.stringify('uploaded successfully'),
        };
    } catch (e) {
        return {
            statusCode: 200,
            body: JSON.stringify('uploaded successfully'),
        };
    }
};


谢谢

【问题讨论】:

  • 您能否发布一些代码来展示您如何将文件保存到 s3 中?

标签: node.js csv lambda aws-api-gateway


【解决方案1】:

我假设您正在使用multipart/form-data 上传文件。如果是这样,您将需要对请求正文进行进一步处理。你可以做一些非常基本的事情,比如使用正则表达式手动解析内容,或者你可以使用像 busboy 这样的库来帮助处理 HTML 表单数据。

您的场景的一个简单示例可能是这样的。

const Busboy = require('busboy');
const AWS = require('aws-sdk');

// This function uses busboy to process the event body and
// return an object containing the file data and other details.
const parseFile = (event) => new Promise((resolve, reject) => {
  let contentType = event.headers['content-type']
  if (!contentType) {
    contentType = event.headers['Content-Type'];
  }

  const busboy = new Busboy({ headers: { 'content-type': contentType } });
  const uploadedFile = {};
  busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
    file.on('data', data => {
      uploadedFile.data = data;
    });

    file.on('end', () => {
      uploadedFile.filename = filename;
      uploadedFile.contentType = mimetype;
    });
  });

  busboy.on('error', error => {
    reject(error);
  });

  busboy.on('finish', () => {
    resolve(uploadedFile);
  });

  busboy.write(event.body, event.isBase64Encoded ? 'base64' : 'binary');
  busboy.end();
});

exports.handler = async (event) => {
  // Use the parse function here
  const { data } = await parseFile(event);

  const s3 = new AWS.S3();
  const params = { Bucket: 'bucket', Key: 'key', Body: data };
  await s3.upload(params).promise();
  return {
    statusCode: 200,
    body: 'uploaded successfully',
  };
};

【讨论】:

  • 谢谢,如果我在邮递员中将它作为二进制发送,这个垃圾文本就不会出现
  • 您是否也可以使用您的客户端应用程序将其作为二进制文件发送?
  • 不,我不这么认为,最好多部分发送。需要使用 busboy 或 multer。否则直接上传到 s3 并对 s3 事件采取措施,谢谢
  • 很公平。如果您认为我已经能够回答您的问题,如果您可以将其标记为已接受,那就太好了。 :-)
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 2018-08-21
  • 2020-09-25
  • 1970-01-01
  • 2016-09-12
  • 2019-06-04
  • 1970-01-01
  • 2020-06-15
相关资源
最近更新 更多