2016-08-16 322 views
0

我試圖在S3亞馬遜存儲桶中創建文件夾,但我發現很難找到正確的文檔來充分解釋需要什麼。我有以下代碼/僞代碼來創建文件夾。任何人都可以解釋或提供的我需要將代碼如何使用PHP在S3存儲桶中創建文件夾

use vendor\aws\S3\S3Client; 

$bucket_url = 'https://***.amazonaws.com/***/'; 
$folder_name = $username . '/'; 

$s3Client = new vendor\aws\S3\S3Client([ 
     'version' => AWS_VERSION, 
     'region' => AWS_REGION, 
     'credentials' => [ 
      'key' => AWS_KEY, 
      'secret' =>AWS_SECRET, 
     ], 
    ]); 

    $s3Client->putObject(array(
     'Bucket' => AWS_BUCKET, // Defines name of Bucket 
     'Key' => AWS_PATH . $folder_name, //Defines Folder name 
     'Body' => "", 
    )); 

回答

2

S3並沒有超出桶文件夾,但對象(文件)可以在自己的名稱中/秒(正斜槓),並且有方法基於一個前綴,使檢索你模擬一個目錄列表。這意味着你不能創建一個空文件夾。

因此,解決方法將放置一個空的txt文件,並在病房後刪除它,但文件夾結構將保留。

/* function to upload empty test.txt file to subfolders /folder/ on S3 bucketname */ 
$s3->putObjectFile(‘test.txt’, ‘bucketname’, ‘/folder/test.txt’, S3::ACL_PUBLIC_READ); 

/* function to delete empty test.txt file to subfolders /folder/ on S3 bucketname */ 
$s3->deleteObject(‘bucketname’, ‘/folder/test.txt’); 
+2

「因此,解決方法將放置一個空的txt文件並在病房後刪除它,但文件夾結構將保留。」這不是真的。如果沒有創建文件夾,則在刪除該對象後沒有任何文件夾可以保留。 –

+0

@MattHouser在這裏,當他在「/folder/test.txt」文件夾中創建一個空的txt文件時,當他刪除「test.txt」時,該文件夾將保留。 – error2007s

+0

這是PHP客戶端'putObjectFile'方法的內置副作用嗎?這不是AWS API的標準行爲。 'putObjectFile'是一個傳統的方法。 PHP的'putObject'方法,現代版本,也會這樣做嗎? –

4

Amazon S3 doesn't really have directories內放置的參數的示例:

在亞馬遜S3,水桶和對象是第一資源,其中,對象存儲在存儲桶。 Amazon S3具有扁平的結構,沒有層次結構,就像您在典型的文件系統中看到的那樣。但是,出於簡化組織的考慮,Amazon S3控制檯支持將文件夾概念作爲分組對象的一種手段。 Amazon S3通過使用對象的鍵名稱前綴來完成此操作。

取而代之,它基於對象的關鍵字的名稱將其僞造。只需使用諸如some/directory/file.txt之類的密鑰上載對象,並且許多工具(包括AWS控制檯中的S3接口)都會像您在名爲some的目錄中名爲directory的目錄中有一個名爲file.txt的對象那樣工作。

又見Amazon S3 boto - how to create a folder?

4

Amazon S3沒有文件夾的概念。對於S3,所有對象都只是一個帶有數據的鍵名。

文件夾是使用'/'字符分隔文件夾的人類概念。但S3不在乎。

當您使用許多第三方工具(甚至是AWS管理控制檯)時,工具通常會查看您的前綴下的對象鍵,當它看到一個「/」時,它會將其解釋爲夾。

但是沒有辦法「創建文件夾」。

如果您只需PutObject一個帶有您想要的完整路徑的鍵(例如「my/desired/folder/structure/file.txt」)的對象,Amazon S3會將它放在那裏。它不像許多文件系統在創建文件之前必須存在的文件夾。

「創建文件夾」最接近你可以做的是創建一個0字節的對象,在它的關鍵字末尾加上'/'。例如「my/desired/folder/structure /」。但這只是另一個目標。它不會對存儲桶或存儲桶中的任何其他對象的創建或操作產生任何影響。

相關問題