2013-02-26 3 views

Répondre

72

Try this ...

import boto 
import boto.s3 
import sys 
from boto.s3.key import Key 

AWS_ACCESS_KEY_ID = '' 
AWS_SECRET_ACCESS_KEY = '' 

bucket_name = AWS_ACCESS_KEY_ID.lower() + '-dump' 
conn = boto.connect_s3(AWS_ACCESS_KEY_ID, 
     AWS_SECRET_ACCESS_KEY) 


bucket = conn.create_bucket(bucket_name, 
    location=boto.s3.connection.Location.DEFAULT) 

testfile = "replace this with an actual filename" 
print 'Uploading %s to Amazon S3 bucket %s' % \ 
    (testfile, bucket_name) 

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


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

[UPDATE] Je ne suis pas pythonist, donc merci pour le heads up sur les déclarations d'importation. En outre, je ne recommande pas de placer des informations d'identification dans votre propre code source. Si vous utilisez cet intérieur AWS Identifiants IAM avec des profils d'instance (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html), et de garder le même comportement dans votre environnement Dev/Test, utilisez quelque chose comme Hologramme de AdRoll (https://github.com/AdRoll/hologram)

+6

Je voudrais éviter les multiples lignes d'importation, non pythonique. Déplacez les lignes d'importation vers le haut, et pour le boto, vous pouvez utiliser de boto.s3.connection importer S3Connection; conn = S3Connection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY); bucket = conn.create_bucket (nom du compartiment ...); bucket.new_key (nom-clé, ...). set_contents_from_filename .... – cgseller

28

J'utilisé cela et il est très simple à mettre en œuvre

import tinys3 

conn = tinys3.Connection('S3_ACCESS_KEY','S3_SECRET_KEY',tls=True) 

f = open('some_file.zip','rb') 
conn.upload('some_file.zip',f,'my_bucket') 

https://www.smore.com/labs/tinys3/

+0

Je ne pense pas que cela fonctionne pour les gros fichiers. J'ai dû utiliser ceci: http://docs.pythonboto.org/en/latest/s3_tut.html#storing-large-data – wordsforthewise

+0

Cela m'a également conduit à cette correction: https://github.com/boto/boto/ issues/2207 # issuecomment-60682869 et ceci: http://stackoverflow.com/questions/5396932/why-are-no-amazon-s3-authentication-handlers-ready – wordsforthewise

+0

Puisque le projet tinys3 est abandonné, vous ne devriez pas l'utiliser . https://github.com/smore-inc/tinys3/issues/45 –

27

Pas besoin de le faire si compliqué que ça:

s3_connection = boto.connect_s3() 
bucket = s3_connection.get_bucket('your bucket name') 
key = boto.s3.key.Key(bucket, 'some_file.zip') 
with open('some_file.zip') as f: 
    key.send_file(f) 
+0

Cela fonctionnera, mais pour les fichiers .zip volumineux, vous devrez peut-être utiliser chunked. http://www.elastician.com/2010/12/s3-multipart-upload-in-boto.html – cgseller

+1

Oui .. pratique moins compliquée et couramment utilisée –

+1

J'ai essayé cela, cela ne fonctionne pas, mais k.set_contents_from_filename (testfile, cb = percent_cb, num_cb = 10) fait – Simon

5
from boto3.s3.transfer import S3Transfer 
import boto3 
#have all the variables populated which are required below 
client = boto3.client('s3', aws_access_key_id=access_key,aws_secret_access_key=secret_key) 
transfer = S3Transfer(client) 
transfer.upload_file(filepath, bucket_name, folder_name+"/"+filename) 
+0

qu'est ce que filepath et qu'est ce que folder_name + filename?il est source de confusion – colintobing

+0

@colintobing filepath est le chemin du fichier sur le cluster et folder_name/filename est la convention de nommage que vous voudriez avoir à l'intérieur s3 seau –

+1

wow, pourquoi y a-t-il 50 façons de le faire ... –

7

Cela permettra également de travailler:

import os 
import boto 
import boto.s3.connection 
from boto.s3.key import Key 

try: 

    conn = boto.s3.connect_to_region('us-east-1', 
    aws_access_key_id = 'AWS-Access-Key', 
    aws_secret_access_key = 'AWS-Secrete-Key', 
    # host = 's3-website-us-east-1.amazonaws.com', 
    # is_secure=True,    # uncomment if you are not using ssl 
    calling_format = boto.s3.connection.OrdinaryCallingFormat(), 
    ) 

    bucket = conn.get_bucket('YourBucketName') 
    key_name = 'FileToUpload' 
    path = 'images/holiday' #Directory Under which file should get upload 
    full_key_name = os.path.join(path, key_name) 
    k = bucket.new_key(full_key_name) 
    k.set_contents_from_filename(key_name) 

except Exception,e: 
    print str(e) 
    print "error" 
2
import boto 
from boto.s3.key import Key 

AWS_ACCESS_KEY_ID = '' 
AWS_SECRET_ACCESS_KEY = '' 
END_POINT = ''       # eg. us-east-1 
S3_HOST = ''       # eg. s3.us-east-1.amazonaws.com 
BUCKET_NAME = 'test'   
FILENAME = 'upload.txt'     
UPLOADED_FILENAME = 'dumps/upload.txt' 
# include folders in file path. If it doesn't exist, it will be created 

s3 = boto.s3.connect_to_region(END_POINT, 
          aws_access_key_id=AWS_ACCESS_KEY_ID, 
          aws_secret_access_key=AWS_SECRET_ACCESS_KEY, 
          host=S3_HOST) 

bucket = s3.get_bucket(BUCKET_NAME) 
k = Key(bucket) 
k.key = UPLOADED_FILENAME 
k.set_contents_from_filename(FILENAME) 
0
import boto3 

s3 = boto3.resource('s3') 
BUCKET = "test" 

s3.Bucket(BUCKET).upload_file("your/local/file", "dump/file") 
+0

pouvez-vous expliquer cette ligne s3.Bucket (BUCKET) .upload_file ("votre/local/fichier", "dump/fichier ") – venkat

+0

@venkat" votre/local/fichier "est un chemin de fichier tel que" /home/fichier.txt "sur l'ordinateur en utilisant python/boto et" dump/fichier "est un nom de clé pour stocker le fichier sous le seau S3. Voir: http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file –

Questions connexes