[英]How to create nested folders in aws s3 bucket using nodejs with lambda function?
在我的項目中,我使用的是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
});
向下滾動以獲取解釋:
正文—(緩沖區,類型數組,Blob,字符串,ReadableStream)對象數據。
存儲桶—(字符串)啟動PUT操作的存儲桶的名稱。
Key —(字符串)為其發起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執行角色來關聯必要的權限,該角色經過定制以僅創建Lambda源代碼所需的特定操作(在您的示例中為S3訪問的s3:PutObject
和托管策略arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
用於CloudWatch日志的arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
。
您每個事件調用一次s3.createBucket()
,這意味着(與您的解釋相反)您將嘗試為每次Lambda調用創建一個新存儲桶。
您正在觸發s3.putObject()
回調之前調用callback(...)
。 因此,您的函數將在完成之前返回。 將您的回調調用s3.putObject()
回調內部,並確保在失敗的情況下使用錯誤參數調用該回調,以確保函數正確返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.