簡體   English   中英

如何使用帶有Lambda函數的Node.js在AWS S3存儲桶中創建嵌套文件夾?

[英]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
};

評論

  • 通常,永遠不要將憑據(在這種情況下為accessKeyIdsecretAccessKey )存儲為源代碼的一部分。 在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM