it-swarm.com.de

So laden Sie eine Datei in S3 hoch, ohne eine temporäre lokale Datei zu erstellen

Gibt es eine mögliche Methode, um eine Datei hochzuladen, die dynamisch auf Amazon S3 generiert wird, ohne zuerst eine lokale Datei zu erstellen und dann auf den S3-Server hochzuladen? Ich benutze Python. Vielen Dank

22
susanne

Hier ein Beispiel zum Herunterladen eines Bildes (unter Verwendung der Anforderungsbibliothek) und Hochladen auf s3, ohne in eine lokale Datei zu schreiben:

import boto
from boto.s3.key import Key
import requests

#setup the bucket
c = boto.connect_s3(your_s3_key, your_s3_key_secret)
b = c.get_bucket(bucket, validate=False)

#download the file
url = "http://en.wikipedia.org/static/images/project-logos/enwiki.png"
r = requests.get(url)
if r.status_code == 200:
    #upload the file
    k = Key(b)
    k.key = "image1.png"
    k.content_type = r.headers['content-type']
    k.set_contents_from_string(r.content)
21
JimJty

Das Objekt boto library Key verfügt über mehrere Methoden, die Sie interessieren könnten:

Ein Beispiel für die Verwendung von set_contents_from_string finden Sie im Abschnitt Speichern von Daten der boto-Dokumentation. Der Vollständigkeit halber wurde hier Folgendes eingefügt:

>>> from boto.s3.key import Key
>>> k = Key(bucket)
>>> k.key = 'foobar'
>>> k.set_contents_from_string('This is a test of S3')
10
jterrace

Sie könnten BytesIO aus der Python-Standardbibliothek verwenden.

from io import BytesIO
bytesIO = BytesIO()
bytesIO.write('whee')
bytesIO.seek(0)
s3_file.set_contents_from_file(bytesIO)
8
Roy Hyunjin Han

Ich gehe davon aus, dass Sie boto verwenden. botos Bucket.set_contents_from_file() akzeptiert ein StringIO-Objekt, und jeder Code, den Sie zum Schreiben von Daten in eine Datei geschrieben haben, sollte für das Schreiben in ein StringIO-Objekt leicht anpassbar sein. Wenn Sie einen String generieren, können Sie set_contents_from_string() verwenden.

2
kindall

Angesichts der Tatsache, dass die Verschlüsselung im Ruhezustand ein beliebter Datenstandard ist, unterstützt smart_open diese Funktion nicht

0
Bart Schelfhout

Sie können versuchen, smart_open ( https://pypi.org/project/smart_open/ ) zu verwenden. Ich habe es genau dafür benutzt: Dateien direkt in S3 schreiben.

0
dd.

Ich hatte ein Diktat-Objekt, das ich als JSON-Datei auf S3 speichern wollte, ohne eine lokale Datei zu erstellen. Der folgende Code hat bei mir funktioniert:

from smart_open import smart_open

with smart_open('s3://access-key:[email protected]/file.json', 'wb') as fout:
    fout.write(json.dumps(dict_object).encode('utf8'))
0

Update für boto3:

aws_session = boto3.Session('my_access_key_id', 'my_secret_access_key')
s3 = aws_session.resource('s3')
s3.Bucket('my_bucket').put_object(Key='file_name.txt', Body=my_file)
0
atheoist
def upload_to_s3(url, **kwargs):
    '''
    :param url: url of image which have to upload or resize to upload
    :return: url of image stored on aws s3 bucket
    '''

    r = requests.get(url)
    if r.status_code == 200:
        # credentials stored in settings AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
        conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, Host=AWS_Host)

        # Connect to bucket and create key
        b = conn.get_bucket(AWS_Bucket_Name)
        k = b.new_key("{folder_name}/{filename}".format(**kwargs))

        k.set_contents_from_string(r.content, replace=True,
                                   headers={'Content-Type': 'application/%s' % (FILE_FORMAT)},
                                   policy='authenticated-read',
                                   reduced_redundancy=True)

        # TODO Change AWS_EXPIRY
        return k.generate_url(expires_in=AWS_EXPIRY, force_http=True)
0
Naveen Agarwal