2016-05-11 1 views
0

Ich habe eine AWS Lambda-Funktion, um ein Formular mit Feldern einschließlich einer Datei von S3 zu einem HTML-Server zu senden.So senden Sie eine Multipart/Formulardaten mit einer Datei von AWS S3

import requests 
url = 'http://...' 
# ... 
self.session = requests.session() 
# ... 

filename = 'mammals/aboutzebras.doc' 
data = { 
    "name":"document", 
    "method":"upload" 
} 

resource = boto3.resource('s3')   
objectSummary = resource.ObjectSummary('bucket', filename) 
body = objectSummary.get()["Body"] 
file_content = body.read() 

files = {'file': ('content', file_content, 'application/doc;charset=utf8')} 

page = self.session.post(
    url, 
    files=files, 
    data=data 
    ) 

print("Status code = %s" % page.status_code) 
# >> Status code = 500 

Ich bin immer erfolgreich die Daten aus einer MS-Word-Datei von AWS S3 und es in file_content setzen, aber muss ich base64 es kodieren? (Ich habe es ohne Erfolg versucht).

Auf Anfrage Objekt von requests.post schickte ich in den Header sehen Content-Length richtig eingestellt ist, Content-Type ist multipart/form-data und dass ein bounday gesetzt.

Mein Anruf an self.sessions.post gibt einen Statuscode von 500 vom Server zurück, den ich anrufe. Was fehlt mir?

Wenn ich an die url mit einem <form> in einem HTML-Dokument einreichen dann bekomme ich ein status_code von 200 zurück und alles ist gut.

Antwort

0

Ein Missverständnis der Beispiele I gefolgt:

files = {'file': ('content', file_content, 'application/doc;charset=utf8')} 

Die 'file' Position auf den Namen des Formularfeldes muss und nicht 'file' und 'content' ist der Dateiname und nicht das Formularfeld Name.

z.B.

files = {'fieldname': ('filename.ext', file_content, 'application/doc;charset=utf8')} 
Verwandte Themen