在我的项目中,我使用的是Angular 6,带有lambda函数和api网关的nodejs,下面是我的文件夹结构。
--Bucket Name
|--Folder (folder name dynamically change based on user login)
|----sub Folder (sub folder name dynamically change)
|--- bird.jpg (file name also dynamic)
我使用下面的代码创建了存储桶和文件夹,我需要在文件夹中创建子文件夹并存储jpg或文本文件。下面是我的代码:
var AWS = require('aws-sdk');
AWS.config.update({
region: 'us-east-2',
accessKeyId: 'accessid',
secretAccessKey: 'secret id'
});
var s3 = new AWS.S3();
var bucketName = 'bucket name';
exports.handler = function uploadToS3(event, context, callback) {
s3.createBucket({Bucket: bucketName}, function() {
var params = {Bucket: bucketName,Key: event['keyName']};
s3.putObject(params, function(err, data) {
if (err)
console.log(err);
else
console.log("Successfully uploaded data to " + bucketName);
});
});
callback(null,{ result : 'SUCCESS'});
};
如何在文件夹中创建子文件夹并在子文件夹中存储文本或jpg值?
在S3中,没有“子文件夹”,它是平面存储。它只是一个桶中的文件。但是,如果在文件密钥中包含正斜杠,则AWS S3控制台(和其他工具)将使用它来显示文件,就像它们位于“文件夹”中一样。
folder1/folder2/bird.jpg
有两个“前缀”,但是单个文件的单个密钥。
所以只需将它命名为您想要的,您的“文件夹结构”就是您自己创建的。 S3将它存储在桶中!
如果您直接上传到不存在的路径,S3将为您创建文件夹。
因此,如果您上传,例如,您有以下结构
folder --- > subfolder --> image
如果您在上传时指定路径
/folder/subfolder/image.jpg
S3将自动创建文件夹和子文件夹。
S3中没有文件夹。存储桶中的每个对象都使用其键引用。但是,AWS控制台(和其他客户端)选择显示密钥,就好像密钥中的每个/
都充当文件夹分隔符一样。
从S3.putObject() API文档复制(向下滚动):
var params = {
Bucket: 'STRING_VALUE', /* required */
Key: 'STRING_VALUE', /* required */
Body: new Buffer('...') || 'STRING_VALUE' || streamObject,
// other parameters omitted
};
s3.putObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
向下滚动以获得解释:
Body - (Buffer,Typed Array,Blob,String,ReadableStream)对象数据。
Bucket - (字符串)启动PUT操作的存储桶的名称。
Key - (String)启动PUT操作的对象键。
将params
翻译成你的例子:
var folder = // ...
var subFolder = // ...
var fileName = // ...
var fileContent = // ...
var params = {
Bucket: bucketName,
Key: `${folder}/${subFolder}/${fileName}`,
Body: fileContent
};
评论
accessKeyId
和secretAccessKey
)存储为源代码的一部分。在AWS Lambda中,您通过创建Lambda Execution Role来关联必要的权限,该s3:PutObject
已定制为仅创建Lambda源代码所需的特定操作(在您的示例中,用于S3访问的arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
和用于CloudWatch日志的托管策略s3.createBucket()
)。callback(...)
一次,这意味着您(与您的解释相反)将尝试为每个Lambda调用创建一个新存储桶。s3.putObject()
回调被触发之前,你正在调用s3.putObject()
。因此,您的函数将在完成之前返回。在qazxswpoi回调中移动您的回调调用,并确保在未能确保函数正确返回的情况下使用error参数调用回调。