2017-11-23 14 views
0

다음 패턴으로 일부 파일과 매개 변수를 멀티 파트로 POST하려고합니다. 나는 dict과 list를 모두 시도했다. listHTTP 415입니다. 그래서 나는 dict으로 앞으로 갔다. 나는 몇 가지 매개 변수뿐만 아니라 일반 이름 '파일'(각각의 파일 이름과 함께) 아래에 여러 개의 파일을 게시하고 싶습니다.파이썬에서의 복잡한 POST 요청 - 멀티 파트 파일 - 압축 할 값이 너무 많습니다.

매개 변수가 제대로 작동되는 문자열은 오류가 파일을했다 딕셔너리는

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

사용하여 POST python-requests

requests.post(url='http://localhost:8888/upload',files=multipart) 
를 오브젝트 여러 부분에서 통과

데이터를 업로드

오류

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) 

예상 POST 바디

------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-- 

답변

1

는 사전을 사용할 수 없지만 당신이 files 매개 변수에 튜플의 목록을 사용할 수있는 동일한 이름을 가지고있다.
나머지 양식 데이터의 경우 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) 

요청 본문 :

--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'와 'PARAM2은'파일은 잘하지? 다음과 같아야합니다

요청 : 파일의 항목을 모두 이후

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

나는 문자열 PARAMS와 함께 작업 POST를 얻을 수 있었다. 파일에 문제가 있습니다. 또한이 방법을 전달하면 "file1.xml"및 "file2.xml"이라는 두 개의 POST 이름이 생성되는 반면 POST 이름은 "file" –