问题描述
您好,我是AWS上的新用户,我试图在我的存储桶s3中上传一个csv文件,但是当文件大于10mb时,它正在重播“ {“ message”:“ Request Entity Too Large”}}我正在使用邮递员要这样做。以下是我创建的当前代码,但是在将来,我将添加一些验证以更改要上载为格式的文件的名称。可以使用这种代码来执行此操作吗?或者,如果您有任何建议可以帮助我解决遇到的问题,那么该如何解决?
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const bucket = process.env.UploadBucket;
const prefix = "csv-files/";
const filename = "file.csv";
exports.handler = (event,context,callback) => {
let data = event.body;
let buff = new Buffer(data,'base64');
let text = buff.toString('ascii');
console.log(text);
let textFileSplit = text.split('?');
//get filename split
let getfilename = textFileSplit[0].split('"');
console.log(textFileSplit[0]);
console.log(textFileSplit[1]);
// //remove lower number on csv
let csvFileSplit = textFileSplit[1].split('--')
const params = {
Bucket: bucket,Key: prefix + getfilename[3],Body: csvFileSplit[0]
};
s3.upload(params,function (err,data) {
if (err) {
console.log('error uploading');
callback(err);
}
console.log("Uploaded")
callback(null,"Success")
});
}
解决方法
对于这种情况,我们通常使用不同的方法。
您可以直接将文件发送到S3,而不是通过API网关将文件发送到lambda。这将使您的解决方案更加健壮,并降低成本,因为您无需将数据传输到API Gateway,也不需要在lambda中处理整个文件。
问题是:如何以安全的方式做到这一点,而又不向互联网上的所有人打开S3存储桶并向其中上传任何内容?您使用s3签名的URL。带签名的网址是S3的一项功能,可让您在url中烘焙正确的权限,以将对象上传到受保护的存储桶。
总的来说,该过程将是:
- 前端向API网关发送请求;
- API网关将请求转发给Lambda函数;
- Lambda函数生成一个签名的Url,具有将对象上传到特定s3存储桶的权限;
- API网关将响应从Lambda函数发送回前端。前端将文件上传到已签名的网址。
要生成签名的URL,您将需要在lambda函数中使用常规的aws-sdk。在那里,您将调用方法getSignedUrl(签名取决于您的语言)。您可以找到有关签名URL here的更多信息。