2014-02-11 5 views
11

Ich habe eine Zip-Datei in den Speicher geladen (nicht auf der Festplatte persistent). Die Zip-Datei enthält JPG-Bilder. Ich versuche, jedes JPG in s3 hochzuladen, aber erhalte einen Fehler.Schreiben von Bytes Stream zu s3 mit Python

# already have an opened zipfile stored in zip_file 
# already connected to s3 

files = zip_file.namelist() 

for f in files: 
    im = io.BytesIO(zip_file.read(f)) 
    s3_key.key = f 
    s3_key.set_contents_from_stream(im) 

bekomme ich folgende Fehlermeldung:

BotoClientError: BotoClientError: s3 does not support chunked transfer

Was mache ich falsch?

+0

siehe [diese Frage] (https://stackoverflow.com/questions/14060479) – goncalopp

+0

@goncalopp ahh. Ich möchte das Bild nicht zuerst auf Festplatte speichern, wie lädt man eine Datei im Speicher auf s3 hoch? - thx – IUnknown

+1

Kennen Sie die Größe der Daten? S3 unterstützt keine Chunked-Codierung, daher müssen Sie in der Anforderung einen korrekten Header "ContentLength" angeben. – garnaat

Antwort

6

Hier ist die Lösung. Ich dachte über das Problem nach.

files = zip_file.namelist() 

for f in files: 
    data = zip_file.read(f) 
    s3_key._key.key = f 
    s3_key._key.set_contents_from_string(data) 

Das war alles, was es brauchte.

2

Boto unterstützt neben S3 auch andere Speicherdienste wie Google Cloud Storage. Die Methode set_contents_from_stream funktioniert nur für Dienste, die eine Chunked-Übertragung unterstützen (siehe https://codereview.appspot.com/4515170). S3 unterstützt das nicht (Siehe technische FAQs unter http://aws.amazon.com/articles/1109.)

Es ist bedauerlich, aber Sie können nicht von einem Stream zu S3 hochladen.

+0

hmmm, das scheint eine ernsthafte Einschränkung zu sein, da das Bild auf dem Datenträger gespeichert werden muss, bevor es auf s3 hochgeladen wird. Ist das korrekt, kann ich ein Bild nicht im Speicher speichern? – IUnknown

+0

Sie können set_contents_from_string verwenden, wenn sich alle Ihre Daten in einer Zeichenfolge im Speicher befinden. –

+3

Ahh, da ich jpgs im Speicher habe, was ist der empfohlene Weg in Python, sie als s3 als jpg-Datei mit set_contents_from_string zu schreiben? Danke. – IUnknown