2016-03-29 2 views
0

Ich möchte eine Datei mit Anfragen senden, aber der Server arbeitet mit einer festen Grenze bei ***** gesetzt. Ich kann nur eine Datei senden, aber das requests Modul erstellt eine zufällige Grenze. Wie überschreibe ich es?Python-Setup-Grenze für POST mit multipart/Formulardaten mit Anfragen

import requests 

url='http://xxx.xxx.com/uploadfile.php' 
fichier= {'uploadedfile':open('1103290736_2016_03_23_13_32_55.zip','rb')} 
headers2={'Connection':'Keep-Alive','User-Agent':'Dalvik/1.6.0 (Linux; U; Android 4.4.2; S503+ Build/KOT49H)','Accept-Encoding':'gzip'} 
session= requests.Session() 
session.post(url,headers=headers2,files=fichier) 
session.close() 
+0

Das ist ein ** sehr ** defekter Server. Können Sie den Server nicht reparieren? –

+0

Sie müssen Ihre eigene Codierung vornehmen und den Header "Content-Type" mit der eingeschlossenen Begrenzung festlegen. –

+0

ich weiß, wie man Content-Type setzt, aber nicht wie ich meine eigene Kodierung machen soll. Kannst du ein Beispiel oder einen Link geben? –

Antwort

1

Boy, das ist ein sehr gebrochener Server. Wenn Sie können, reparieren Sie stattdessen den Server.

Sie können nicht sagen requests welche Grenze zu wählen. Sie können Ihre eigene multipart/form-data Nutzlast stattdessen bauen, die mit email.mime package:

from email.mime.multipart import MIMEMultipart 
from email.mime.application import MIMEApplication 

related = MIMEMultipart('form-data', '*****') # second argument is the boundary. 
file_part = MIMEApplication(
    open('1103290736_2016_03_23_13_32_55.zip', 'rb').read(), 
    # optional: set a subtype: 'zip', 
) 
file_part.add_header('Content-disposition', 'form-data; name="uploadedfile"') 
related.attach(file_part) 

body = related.as_string().split('\n\n', 1)[1] 
headers = dict(related.items()) 
headers['User-Agent'] = 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; S503+ Build/KOT49H)' 

r = session.post(url, data=body, headers=headers) 

Dies setzt Content-Type: multipart/form-data; boundary="*****" als Kopf und der Körper nutzt ***** als Grenze (mit entsprechenden -- Pre- und Postfix).

0

Eine einfache Alternative ist requests-toolbelt; unten Beispiel aus dieser GitHub issue thread genommen:

from requests_toolbelt import MultipartEncoder 

fields = { 
# your multipart form fields 
} 

m = MultipartEncoder(fields, boundary='my_super_custom_header') 
r = requests.post(url, headers={'Content-Type': m.content_type}, data=m.to_string()) 

Dies führt jedoch eine zusätzliche Abhängigkeit und slow to upload large files sein kann.

Verwandte Themen