簡體   English   中英

使用boto3將文件上傳到S3存儲桶中的特定文件夾

[英]uploading file to specific folder in S3 bucket using boto3

我的代碼正在工作。 我面臨的唯一問題是,我無法在S3存儲桶中指定要將文件放入其中的文件夾。這是我所擁有的:

with open("/hadoop/prodtest/tips/ut/s3/test_audit_log.txt", "rb") as f:
    s3.upload_fileobj(f, "us-east-1-tip-s3-stage", "BlueConnect/test_audit_log.txt")

S3中的文件(“對象”)實際上是由它們的“鍵”(〜文件夾+文件名)存儲在存儲桶中的平面結構中的。 如果在鍵中放置斜杠( / ),則S3會向用戶表示此斜杠,就好像它是文件夾結構的標記,但是這些文件夾實際上在S3中並不存在,它們只是為用戶提供了便利,並且允許大多數文件系統都熟悉的通常的文件夾導航。

所以,你的代碼表示,雖然看起來你是把一個名為test_audit_log.txt一個文件夾,名為在BlueConnect ,你實際上只是配售對象,代表你的文件,在us-east-1-tip-s3-stage具有BlueConnect/test_audit_log.txt密鑰的BlueConnect/test_audit_log.txt 為了然后(似乎)將其放置在新文件夾中,只需將密鑰設置為文件的完整路徑即可,例如:

# upload_fileobj(file, bucket, key)
s3.upload_fileobj(f, "us-east-1-tip-s3-stage", "folder1/folder2/test_audit_log.txt")

在此示例中,對象的“鍵”為folder1/folder2/test_audit_log.txt ,您可以將其視為文件 test_audit_log.txt ,位於文件夾folder2內的文件夾folder1中-這就是它在S3上的顯示方式,通常是與本地計算機的文件夾結構不同的文件夾結構。

@danimal的解釋幾乎捕獲了所有內容。 如果只想在s3中創建類似文件夾的對象,則只需指定該文件夾名稱並以“ /”結尾,這樣,當您從控制台查看它時,它將看起來像一個文件夾。

它是一個沒有用的空對象,沒有一個主體(將其視為具有空值的鍵),只是為了吸引人,但是如果您真的想這樣做,可以這樣做。 1)您可以在控制台上以交互方式創建它,因為它為您提供了選項2_。您可以使用aws sdk。 boto3具有s3客戶端的put_object方法,您在其中將密鑰指定為“ your_folder_name /”,請參見以下示例:

import boto3
session = boto3.Session() # I assume you know how to provide credentials etc.
s3 = session.client('s3', 'us-east-1')

bucket = s3.create_bucket('my-test-bucket')
response = s3.put_object(Bucket='my-test-bucket', Key='my_pretty_folder/' # note the ending "/"

那里有你的水桶。

同樣,當您上傳文件時,請指定“ my-test-bucket / my_file”,然后創建一個名為“ my-test-bucket / my_file”的“ key ”,並將文件內容作為“ ”。

在這種情況下,存儲桶中有2個對象。 第一個對象的主體為空,看起來像一個文件夾,而第二個對象看起來像在里面,但正如@danimal指出的那樣,實際上您是在同一平面層次結構中創建了2個鍵,它只是“看起來像”我們使用的東西在文件系統中查看。

如果刪除文件,則仍有其他對象,因此在aws控制台上,文件夾似乎仍然存在,但內部沒有文件。

如果您跳過創建文件夾的操作,而只是像上次那樣僅上傳文件,則仍會在AWS Console中看到文件夾結構,但此時只有一個對象。

但是,當您從命令行列出對象時,您會看到一個對象,如果在控制台上將其刪除,則文件夾似乎也消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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