Cara mengunggah file ke direktori di S3 bucket menggunakan boto

107

Saya ingin menyalin file di ember s3 menggunakan python.

Contoh: Saya memiliki bucket name = test. Dan di ember, saya memiliki 2 nama folder "dump" & "input". Sekarang saya ingin menyalin file dari direktori lokal ke folder S3 "dump" menggunakan python ... Adakah yang bisa membantu saya?

Dheeraj Gundra
sumber

Jawaban:

105

Coba ini...

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] Saya bukan pythonist, jadi terima kasih atas perhatiannya tentang pernyataan impor. Juga, saya tidak akan merekomendasikan menempatkan kredensial di dalam kode sumber Anda sendiri. Jika Anda menjalankan ini di dalam AWS, gunakan Kredensial IAM dengan Profil Instance ( http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html ), dan untuk menjaga perilaku yang sama di Lingkungan Dev / Test Anda, gunakan sesuatu seperti Hologram dari AdRoll ( https://github.com/AdRoll/hologram )

Felipe Garcia
sumber
8
Saya akan menghindari beberapa baris impor, bukan pythonic. Pindahkan garis impor ke atas, dan untuk boto, Anda dapat menggunakan dari boto.s3.connection import S3Connection; samb = S3Connection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY); bucket = conn.create_bucket (nama bucket ...); bucket.new_key (keyname, ...). set_contents_from_filename ....
cgseller
2
boto.s3.key.Key tidak ada di 1.7.12
Alex Pavy
perbarui per April 2020 ikuti tautan ini upload_file_to_s3_using_python
Prayag Sharma
48

Tidak perlu terlalu rumit:

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)
vcarel.dll
sumber
Ini akan berhasil, tetapi untuk file .zip besar Anda mungkin perlu menggunakan chunked. elastician.com/2010/12/s3-multipart-upload-in-boto.html
cgseller
2
Ya .. latihan yang tidak terlalu rumit dan umum digunakan
Leo Prince
1
Saya mencoba ini, tidak berhasil, tetapi k.set_contents_from_filename (testfile, cb = percent_cb, num_cb = 10) berhasil
Simon
1
Apakah Anda menggunakan boto 2, terbaru? Bagaimanapun, set_contents_from_filename adalah opsi yang lebih sederhana. Lakukan!
vcarel
3
key.set_contents_from_filename('some_file.zip')juga akan bekerja di sini. Lihat dok . Kode yang sesuai untuk boto3 dapat ditemukan di sini .
Greg Sadetsky
44
import boto3

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

s3.Bucket(BUCKET).upload_file("your/local/file", "dump/file")
Boris
sumber
dapatkah Anda menjelaskan baris ini s3.Bucket (BUCKET) .upload_file ("your / local / file", "dump / file")
venkat
@venkat "your / local / file" adalah jalur file seperti "/home/file.txt" di komputer menggunakan python / boto dan "dump / file" adalah nama kunci untuk menyimpan file di bawah dalam S3 Bucket. Lihat: boto3.readthedocs.io/en/latest/reference/services/…
Josh S.
1
Sepertinya pengguna memiliki Kunci AWS yang telah dikonfigurasi sebelumnya, untuk melakukan ini buka prompt dan ketik perintah anaconda Anda aws configure, masukkan info Anda dan Anda akan secara otomatis terhubung dengan boto3. Periksa boto3.readthedocs.io/en/latest/guide/quickstart.html
seeiespi
solusi paling sederhana IMO, semudah tinys3 tetapi tanpa perlu ketergantungan eksternal lain. Juga sangat merekomendasikan untuk mengatur kunci AWS Anda aws configuresebelumnya untuk membuat hidup Anda lebih mudah.
barlaensdoonn
Apa yang terjadi jika ada beberapa profil dalam kredensial. cara lulus kredensial khusus
Tara Prasad Gurung
36

Saya menggunakan ini dan sangat mudah untuk diterapkan

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/

Oren Efron
sumber
Saya tidak berpikir ini berfungsi untuk file besar. Saya harus menggunakan ini: docs.pythonboto.org/en/latest/s3_tut.html#storing-large-data
wordsforthewise
6
Karena proyek tinys3 ditinggalkan, Anda tidak boleh menggunakan ini. github.com/smore-inc/tinys3/issues/45
Halil Kaskavalci
Hal ini tidak lagi berfungsi untuk saya pada tahun 2019. tinys3 tidak hanya ditinggalkan ... Saya rasa tidak berfungsi lagi. Bagi siapa pun yang memutuskan untuk mencoba ini, jangan heran jika Anda mendapatkan kesalahan 403. boto3.clientSolusi sederhana (seperti jawaban Manish Mehra) segera bekerja.
Russ
16
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)
Manish Mehra
sumber
apa itu jalur file dan apa nama_folder + nama file? itu membingungkan
colintobing
Jalur file @colintobing adalah jalur file pada cluster dan nama_folder / namafile adalah konvensi penamaan yang Anda inginkan di dalam ember s3
Manish Mehra
2
@ManishMehra Jawabannya akan lebih baik jika Anda mengeditnya untuk memperjelas titik kebingungan colintobing; tidak jelas tanpa memeriksa dokumen parameter mana yang merujuk ke jalur lokal dan mana yang ke jalur S3 tanpa memeriksa dokumen atau membaca komentar. (Setelah selesai, Anda dapat menandai agar semua komentar di sini dihapus, karena komentar tersebut akan usang.)
Mark Amery
aws_access_key_iddan aws_secret_access_keyjuga dapat dikonfigurasi dengan AWS CLI dan disimpan di luar skrip sehingga `client = boto3.client ('s3') dapat dipanggil
yvesva
16

Unggah file ke s3 dalam satu sesi dengan kredensial.

import boto3

session = boto3.Session(
    aws_access_key_id='AWS_ACCESS_KEY_ID',
    aws_secret_access_key='AWS_SECRET_ACCESS_KEY',
)
s3 = session.resource('s3')
# Filename - File to upload
# Bucket - Bucket to upload to (the top level directory under AWS S3)
# Key - S3 object name (can contain subdirectories). If not specified then file_name is used
s3.meta.client.upload_file(Filename='input_file_path', Bucket='bucket_name', Key='s3_output_key')
Roman Orac
sumber
Apa itu s3_output_key?
Roelant
Ini adalah nama file di bucket S3.
Roman Orac
12

Ini juga akan berfungsi:

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"   
Piyush S. Wanare
sumber
7

Ini adalah tiga kapal. Ikuti saja instruksi pada dokumentasi boto3 .

import boto3
s3 = boto3.resource(service_name = 's3')
s3.meta.client.upload_file(Filename = 'C:/foo/bar/baz.filetype', Bucket = 'yourbucketname', Key = 'baz.filetype')

Beberapa argumen penting adalah:

Parameter:

  • Filename ( str) - Jalur ke file yang akan diunggah.
  • Keranjang ( str) - Nama keranjang tujuan upload.
  • Key ( str) - Nama yang ingin Anda tetapkan ke file di bucket s3 Anda. Ini bisa sama dengan nama file atau nama lain pilihan Anda, tetapi jenis file harus tetap sama.

    Catatan: Saya berasumsi bahwa Anda telah menyimpan kredensial Anda di ~\.awsfolder seperti yang disarankan dalam praktik konfigurasi terbaik di dokumentasi boto3 .

  • Samuel Nde
    sumber
    Terima kasih Nde Samuel, yang bekerja dengan saya ... Satu hal tambahan yang diperlukan dalam kasus saya adalah membuat keranjang sudah dibuat, untuk menghindari kesalahan "" Keranjang yang ditentukan tidak ada "".
    HassanSh__3571619
    @ HassanSh__3571619 Saya senang itu membantu.
    Samuel Nde
    5
    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)
    
    Shakti
    sumber
    4

    Menggunakan boto3

    import logging
    import boto3
    from botocore.exceptions import ClientError
    
    
    def upload_file(file_name, bucket, object_name=None):
        """Upload a file to an S3 bucket
    
        :param file_name: File to upload
        :param bucket: Bucket to upload to
        :param object_name: S3 object name. If not specified then file_name is used
        :return: True if file was uploaded, else False
        """
    
        # If S3 object_name was not specified, use file_name
        if object_name is None:
            object_name = file_name
    
        # Upload the file
        s3_client = boto3.client('s3')
        try:
            response = s3_client.upload_file(file_name, bucket, object_name)
        except ClientError as e:
            logging.error(e)
            return False
        return True
    

    Untuk lebih lanjut: - https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html

    Noufal Valapra
    sumber
    1

    Untuk contoh upload folder seperti kode berikut dan gambar folder S3 masukkan deskripsi gambar di sini

    import boto
    import boto.s3
    import boto.s3.connection
    import os.path
    import sys    
    
    # Fill in info on data to upload
    # destination bucket name
    bucket_name = 'willie20181121'
    # source directory
    sourceDir = '/home/willie/Desktop/x/'  #Linux Path
    # destination directory name (on s3)
    destDir = '/test1/'   #S3 Path
    
    #max size in bytes before uploading in parts. between 1 and 5 GB recommended
    MAX_SIZE = 20 * 1000 * 1000
    #size of parts when uploading in parts
    PART_SIZE = 6 * 1000 * 1000
    
    access_key = 'MPBVAQ*******IT****'
    secret_key = '11t63yDV***********HgUcgMOSN*****'
    
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            host = '******.org.tw',
            is_secure=False,               # uncomment if you are not using ssl
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    bucket = conn.create_bucket(bucket_name,
            location=boto.s3.connection.Location.DEFAULT)
    
    
    uploadFileNames = []
    for (sourceDir, dirname, filename) in os.walk(sourceDir):
        uploadFileNames.extend(filename)
        break
    
    def percent_cb(complete, total):
        sys.stdout.write('.')
        sys.stdout.flush()
    
    for filename in uploadFileNames:
        sourcepath = os.path.join(sourceDir + filename)
        destpath = os.path.join(destDir, filename)
        print ('Uploading %s to Amazon S3 bucket %s' % \
               (sourcepath, bucket_name))
    
        filesize = os.path.getsize(sourcepath)
        if filesize > MAX_SIZE:
            print ("multipart upload")
            mp = bucket.initiate_multipart_upload(destpath)
            fp = open(sourcepath,'rb')
            fp_num = 0
            while (fp.tell() < filesize):
                fp_num += 1
                print ("uploading part %i" %fp_num)
                mp.upload_part_from_file(fp, fp_num, cb=percent_cb, num_cb=10, size=PART_SIZE)
    
            mp.complete_upload()
    
        else:
            print ("singlepart upload")
            k = boto.s3.key.Key(bucket)
            k.key = destpath
            k.set_contents_from_filename(sourcepath,
                    cb=percent_cb, num_cb=10)

    PS: Untuk URL referensi lebih lanjut

    Willie Cheng
    sumber
    0
    xmlstr = etree.tostring(listings,  encoding='utf8', method='xml')
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            # host = '<bucketName>.s3.amazonaws.com',
            host = 'bycket.s3.amazonaws.com',
            #is_secure=False,               # uncomment if you are not using ssl
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    conn.auth_region_name = 'us-west-1'
    
    bucket = conn.get_bucket('resources', validate=False)
    key= bucket.get_key('filename.txt')
    key.set_contents_from_string("SAMPLE TEXT")
    key.set_canned_acl('public-read')
    Martin
    sumber
    Penjelasan teks dengan apa yang dilakukan kode Anda akan menyenangkan!
    Nick
    0

    Saya memiliki sesuatu yang menurut saya memiliki lebih banyak pesanan:

    import boto3
    from pprint import pprint
    from botocore.exceptions import NoCredentialsError
    
    
    class S3(object):
        BUCKET = "test"
        connection = None
    
        def __init__(self):
            try:
                vars = get_s3_credentials("aws")
                self.connection = boto3.resource('s3', 'aws_access_key_id',
                                                 'aws_secret_access_key')
            except(Exception) as error:
                print(error)
                self.connection = None
    
    
        def upload_file(self, file_to_upload_path, file_name):
            if file_to_upload is None or file_name is None: return False
            try:
                pprint(file_to_upload)
                file_name = "your-folder-inside-s3/{0}".format(file_name)
                self.connection.Bucket(self.BUCKET).upload_file(file_to_upload_path, 
                                                                          file_name)
                print("Upload Successful")
                return True
    
            except FileNotFoundError:
                print("The file was not found")
                return False
    
            except NoCredentialsError:
                print("Credentials not available")
                return False
    
    

    Ada tiga variabel penting di sini, BUCKET const, file_to_upload dan file_name

    BUCKET: adalah nama bucket S3 Anda

    file_to_upload_path: harus berupa jalur dari file yang ingin Anda unggah

    file_name: adalah file dan jalur yang dihasilkan dalam keranjang Anda (ini adalah tempat Anda menambahkan folder atau apa pun)

    Ada banyak cara tetapi Anda dapat menggunakan kembali kode ini di skrip lain seperti ini

    import S3
    
    def some_function():
        S3.S3().upload_file(path_to_file, final_file_name)
    Yesus Walker
    sumber