0

Ich versuche, einige Dateien und Parameter als Multi-Part im folgenden Muster zu senden. Ich habe sowohl Diktat als auch Liste ausprobiert. list warf eine HTTP 415. Also ging ich mit dict weiter. Ich möchte einige Parameter sowie mehrere Dateien unter einem gemeinsamen Namen "Datei" (zusammen mit ihren jeweiligen Dateinamen) veröffentlichen.Komplexe POST-Anfrage in Python - Multipart-Dateien - zu viele Werte zum Entpacken

Die String-Parameter arbeiten gut, der Fehler mit der Datei war laden

Daten innerhalb des mehrteiligen weitergegeben dict Objekt

multipart = { 
    'param1': 'paramVal1', 
    'param2': 'paramVal2', 
    'file': (("file1.xml", ByteIO), ("file1.xml", ByteIO)), 
} 

POST python-requests

requests.post(url='http://localhost:8888/upload',files=multipart) 

Wirft die Fehler

File "C:\Python36\lib\site-packages\requests\api.py", line 107, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "C:\Python36\lib\site-packages\requests\api.py", line 53, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "C:\Python36\lib\site-packages\requests\sessions.py", line 454, in request 
    prep = self.prepare_request(req) 
    File "C:\Python36\lib\site-packages\requests\sessions.py", line 388, in prepare_request 
    hooks=merge_hooks(request.hooks, self.hooks), 
    File "C:\Python36\lib\site-packages\requests\models.py", line 296, in prepare 
    self.prepare_body(data, files, json) 
    File "C:\Python36\lib\site-packages\requests\models.py", line 447, in prepare_body 
    (body, content_type) = self._encode_files(files, data) 
    File "C:\Python36\lib\site-packages\requests\models.py", line 142, in _encode_files 
    fn, fp, ft, fh = v 
ValueError: too many values to unpack (expected 4) 

Erwartete POST Körper

------WebKitFormBoundaryZ7HAof4KTgAB21YV 
Content-Disposition: form-data; name="file"; filename="file1.xml" 
Content-Type: text/xml 


------WebKitFormBoundaryZ7HAof4KTgAB21YV 
Content-Disposition: form-data; name="file"; filename="file2.xml" 
Content-Type: text/xml 


------WebKitFormBoundaryZ7HAof4KTgAB21YV 
Content-Disposition: form-data; name="param1" 

paramVal1 
------WebKitFormBoundaryZ7HAof4KTgAB21YV 
Content-Disposition: form-data; name="param2" 

paramVal2 
------WebKitFormBoundaryZ7HAof4KTgAB21YV-- 

Antwort

1

Da sowohl der Datei Elemente haben den gleichen Namen, den Sie ein Wörterbuch nicht verwenden können, aber Sie können eine Liste von Tupeln in dem files Parameter verwenden. Für den Rest der Formulardaten verwenden Sie den Parameter data.

data = { 
    'param1': 'paramVal1', 
    'param2': 'paramVal2' 
} 
files = [ 
    ("file", ("file1.xml", open("file1.xml", "rb"), "text/xml")), 
    ("file", ("file2.xml", open("file2.xml", "rb"), "text/xml")) 
] 
r = requests.post(url='http://localhost:8888/upload', data=data, files=files) 

print(r.request.body) 

Anfrage Körper:

--85d945c02ac04c9fbdcd9979e34e6d04 
Content-Disposition: form-data; name="param2" 

paramVal2 
--85d945c02ac04c9fbdcd9979e34e6d04 
Content-Disposition: form-data; name="param1" 

paramVal1 
--85d945c02ac04c9fbdcd9979e34e6d04 
Content-Disposition: form-data; name="file"; filename="file1.xml" 
Content-Type: text/xml 


--85d945c02ac04c9fbdcd9979e34e6d04 
Content-Disposition: form-data; name="file"; filename="file2.xml" 
Content-Type: text/xml 


--85d945c02ac04c9fbdcd9979e34e6d04-- 
-1

'param1' und 'param2' sind nicht richtig Dateien?

Ihre Anfrage sollte wie folgt aussehen:

body = {'param1': 'paramVal1', 'param2': 'paramVal2'} 
files = (("file1.xml", ByteIO), (filename, "file2.xml")), 
requests.post(url='http://localhost:8888/upload', files = files, json = body) 
+0

konnte ich die POST Arbeit mit dem String params bekommen. Das Problem lag bei den Dateien. Wenn Sie es auf diese Weise übergeben, würden Sie zwei POST-Namen "file1.xml" und "file2.xml" generieren, während ich für beide Dateien den POST-Namen "file" benötige. –

Verwandte Themen