2017-04-13 532 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