2013-01-14 88 views
33

这是我从博托 - 上传文件到特定位置上亚马逊S3

import sys 
import boto 
import boto.s3 

# AWS ACCESS DETAILS 
AWS_ACCESS_KEY_ID = '' 
AWS_SECRET_ACCESS_KEY = '' 

bucket_name = AWS_ACCESS_KEY_ID.lower() + '-mah-bucket' conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
bucket = conn.create_bucket(bucket_name, location=boto.s3.connection.Location.DEFAULT) 
uploadfile = sys.argv[1] 

print 'Uploading %s to Amazon S3 bucket %s' % \ 
     (uploadfile, bucket_name) 

def percent_cb(complete, total): 
    sys.stdout.write('.') 
    sys.stdout.flush() 

from boto.s3.key import Key 
k = Key(bucket) 
k.key = 'my test file' 
k.set_contents_from_filename(testfile, cb=percent_cb, num_cb=10) 

工作在我的S3代码中,我创建了“目录”,类似这样的“桶/图片/假期”。我知道这些只是虚拟目录。

我的问题是,我怎样才能将这个上传专门修改为S3上的bucket/images/holiday虚拟目录而不是bucket根目录?

回答

51

您需要做的就是在上传之前预先输入密钥名称的虚拟目录路径。例如:

key_name = 'my test file' 
path = 'images/holiday' 
full_key_name = os.path.join(path, key_name) 
k = bucket.new_key(full_key_name) 
k.set_contents_from_filename(...) 

您可能需要对您的应用程序进行一些更改,但希望能够为您提供基本想法。

+0

哦,太好了谢谢。 – Jimmy

+0

吉米你可以粘贴你的代码上传工作。我没有看到你在下面的代码中的任何地方使用了“uploadfile”变量 – Murphy

+0

这也适用于**分段上传**'''mp = self._bucket.initiate_multipart_upload(bucket_key)'''' –

2

您也可以使用此:

from boto.s3.key import Key 

bucket = conn.get_bucket('images') 
k = Key(bucket) 
k.key = 'holiday/my_test_file.txt' 

它是这样工作的我s3_percent_uploader

python.exe s3_percent_uploader.py test_upload.txt testbucket test/upload.txt 

后上传文件将在testbucket /测试/ upload.txt