2017-04-13 531 views
1

還有其他一些類似的問題,但沒有一個具體回答我的問題。我有一個文件夾充滿了我想要上傳到Amazon S3的文件,並且我嘗試了各種不同的東西,都導致無法上傳。這是我現在的代碼。它成功地在S3上創建了文件夾,但沒有上傳。將文件夾全部上傳到Amazon S3中的特定文件夾

import os 
import boto3 

s3_bucket = 'bucketname' 
s3_bucket_region = 'us-east-1' 
folder = 'FolderName' 

key_name = folder + '/' 
s3_connect = boto3.client('s3', s3_bucket_region) 
try: 
    bucket = s3_connect.put_object(Bucket=s3_bucket, Key=key_name) 
    print "Bucket:", bucket 
except Exception as e: 
    print "Bucket Error " , e 

# upload File to S3 
for filename in os.listdir(folder): 

    file_key_name = folder + '/' + filename 
    local_path = os.getcwd() 
    local_name = local_path + '/' + key_name + filename 
    upload = s3_connect.upload_file(local_name, s3_bucket, file_key_name) 

我已經試過的只是類似「文件夾名/」以及「文件夾名/文件名」一file_key_name。我首先想到的第一個參數(local_name)不需要完整的路徑,但是相對路徑可以工作,但是完整或相對路徑都不起作用。

我錯過了什麼?這個部門的文件非常糟糕。另外它不會拋出錯誤,它只是不上傳。

+0

這可能是有用的https://techietweak.wordpress.com/2016/05/16/file-handling-in-aws-s3-with-python-boto-library/在這一行'k.key = fileName '你應該把'k.key = FolderName/FileName'上傳到文件夾。 – moondaisy

+0

我碰到過,但唉,它使用boto庫,而我正在使用boto3。 – maxpearl

+0

我的不好,你有沒有嘗試在文檔中的3個例子?他們都調用'boto3.resource'而不是'boto3.client'。這是一個桶:http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file這是對象之一:http://boto3.readthedocs.io/en /latest/reference/services/s3.html#S3.Object.upload_file使用客戶端(不確定是否與您的客戶端相同):http://boto3.readthedocs.io/en/latest/reference/services/s3.html #S3.Client.upload_file – moondaisy

回答

1

您的代碼對我來說工作得非常好,但您需要刪除在Amazon S3上創建文件夾的try/catch部分。

Amazon S3實際上不支持文件夾。相反,對象的Key包含完整路徑(例如images/foo.jpg)。因此,在將文件存儲在文件夾之前,您不需要創建文件夾(因爲它們不存在!)。

您的代碼在嵌套文件夾時會遇到困難。如果您不需要使用自己的代碼編寫代碼,則可以考慮在AWS Command-Line Interface (CLI)中使用aws s3 syncaws s3 cp命令。

+0

就是這樣。謝謝!幸運的是,我不需要嵌套文件夾,只有一個。它是一個更大的應用程序的一部分,所以它必須在python中。 – maxpearl