Ram*_*ddy 1 amazon-s3 amazon-web-services node.js aws-lambda
在我的项目中,我使用的是 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)
Run Code Online (Sandbox Code Playgroud)
我使用以下代码创建了存储桶和文件夹,我需要在文件夹中创建子文件夹并存储 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'});
};
Run Code Online (Sandbox Code Playgroud)
如何在文件夹中创建子文件夹并在子文件夹中存储文本或 jpg 值??
在 S3 中,没有“子文件夹”,它是平面存储。它只是存储桶中的文件。但是,如果您在文件键中包含正斜杠,AWS S3 控制台(和其他工具)将使用它来显示您的文件,就像它们在“文件夹”中一样。
folder1/folder2/bird.jpg 有两个“前缀”,但对于单个文件是一个 Key。
因此,您可以随意命名它,您可以创建“文件夹结构”。S3 将其存储在存储桶中!
S3 中没有文件夹。存储桶中的每个对象都通过其键进行引用。但是,AWS 控制台(和其他客户端)选择显示密钥,就好像/密钥中的每个密钥都充当文件夹分隔符一样。
从S3.putObject() API 文档复制(向下滚动):
\n\nvar params = {\n Bucket: \'STRING_VALUE\', /* required */\n Key: \'STRING_VALUE\', /* required */\n Body: new Buffer(\'...\') || \'STRING_VALUE\' || streamObject,\n // other parameters omitted\n};\ns3.putObject(params, function(err, data) {\n if (err) console.log(err, err.stack); // an error occurred\n else console.log(data); // successful response\n});\nRun Code Online (Sandbox Code Playgroud)\n\n进一步向下滚动查看说明:
\n\n\n\n\n正文 \xe2\x80\x94(缓冲区、类型化数组、Blob、字符串、ReadableStream)\n 对象数据。
\n\nBucket \xe2\x80\x94 (String)\n 发起 PUT 操作的存储桶的名称。
\n\nKey \xe2\x80\x94 (String)\n 为其启动 PUT 操作的对象键。
\n
翻译params成你的例子:
var folder = // ...\nvar subFolder = // ...\nvar fileName = // ...\nvar fileContent = // ...\n\nvar params = {\n Bucket: bucketName,\n Key: `${folder}/${subFolder}/${fileName}`,\n Body: fileContent\n};\nRun Code Online (Sandbox Code Playgroud)\n\n评论
\n\n作为一般规则,您永远不应该将凭据(在本例中为accessKeyId和secretAccessKey)存储为源代码的一部分。在 AWS Lambda 中,您可以通过创建Lambda 执行角色来关联必要的权限,该角色经过定制,仅创建 Lambda 源代码所需的特定操作(在您的示例中,用于 S3 访问和CloudWatch 日志的s3:PutObject托管策略) 。arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
您每个事件调用s3.createBucket()一次,这意味着您(与您的解释相反)将尝试为每个 Lambda 调用创建一个新存储桶。
您正在触发回调callback(...)之前s3.putObject()调用。因此,您的函数将在完成之前返回。将回调调用移至s3.putObject()回调内部,并确保在无法确保函数正确返回的情况下使用错误参数调用回调。
如果您直接上传到不存在的路径,S3 将为您创建文件夹。
例如,如果您上传,您将具有以下结构
folder --- > subfolder --> image
Run Code Online (Sandbox Code Playgroud)
如果上传时指定路径为
/folder/subfolder/image.jpg
Run Code Online (Sandbox Code Playgroud)
S3 将自动创建文件夹和子文件夹。
| 归档时间: |
|
| 查看次数: |
4948 次 |
| 最近记录: |