在我的项目中,我使用的是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值存储在子文件夹中?
答案 0 :(得分:1)
在S3中,没有“子文件夹”,它是固定存储。它只是存储桶中的文件。但是,如果在文件密钥中包含正斜杠,AWS S3控制台(和其他工具)将使用该斜杠来显示文件,就像它们在“文件夹”中一样。
folder1/folder2/bird.jpg
有两个“前缀”,但是是单个文件的单个密钥。
因此,只需随便命名,即可创建“文件夹结构”。然后S3将其存储在存储桶中!
答案 1 :(得分:0)
如果您直接上传到不存在的路径,S3将为您创建文件夹。
因此,例如,如果您上传,则具有以下结构
folder --- > subfolder --> image
如果您在上传时指定的路径是
/folder/subfolder/image.jpg
S3将自动创建文件夹和子文件夹。
答案 2 :(得分:0)
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 —(缓冲区,类型数组,Blob,字符串,ReadableStream) 对象数据。
桶-(字符串) 发起PUT操作的存储桶的名称。
键-(字符串) 发起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来关联必要的权限,该{{3}}被定制为仅创建Lambda源代码(在您的示例中,s3:PutObject
用于S3访问和托管策略)所需的特定操作。 arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
用于CloudWatch日志。
您每个事件都调用一次s3.createBucket()
,这意味着您(与您的解释相反)将尝试为每个Lambda调用创建一个新存储桶。
您正在调用callback(...)
回调之前调用s3.putObject()
。因此,您的函数将在完成之前返回。将回调移动到s3.putObject()
回调中,并确保在失败的情况下使用错误参数调用该回调,以确保函数正确返回。