Wie versendet man eine multipart/form-data
avec requests
in Python? Wie man eine Datei sendet, verstehe ich, aber wie man die Formulardaten durch diese Methode senden kann nicht verstehen.
Antworten
Zu viele Anzeigen?Sie müssen die name
Attribut der Upload-Datei, die sich im HTML-Code der Website befindet. Beispiel:
autocomplete="off" name="image">
Sie sehen name="image">
? Sie finden es im HTML-Code einer Website zum Hochladen der Datei. Sie müssen es verwenden, um die Datei hochzuladen mit Multipart/form-data
Drehbuch:
import requests
site = 'https://prnt.sc/upload.php' # the site where you upload the file
filename = 'image.jpg' # name example
Fügen Sie hier an der Stelle des Bildes den Namen der hochgeladenen Datei in HTML ein
up = {'image':(filename, open(filename, 'rb'), "multipart/form-data")}
Wenn der Upload erfordert, dass Sie auf die Schaltfläche zum Hochladen klicken, können Sie das auch so machen:
data = {
"Button" : "Submit",
}
Dann starten Sie die Anfrage
request = requests.post(site, files=up, data=data)
Und fertig, die Datei wurde erfolgreich hochgeladen
Schlüssel und Wert von multipart/form-data senden
curl-Befehl:
curl -X PUT http://127.0.0.1:8080/api/xxx ...
-H 'content-type: multipart/form-data; boundary=----xxx' \
-F taskStatus=1
python requests - Kompliziertere POST-Anfragen :
updateTaskUrl = "http://127.0.0.1:8080/api/xxx"
updateInfoDict = {
"taskStatus": 1,
}
resp = requests.put(updateTaskUrl, data=updateInfoDict)
multipart/form-data-Datei senden
curl-Befehl:
curl -X POST http://127.0.0.1:8080/api/xxx ...
-H 'content-type: multipart/form-data; boundary=----xxx' \
-F file=@/Users/xxx.txt
python Anfragen - POST einer Multipart-kodierten Datei :
filePath = "/Users/xxx.txt"
fileFp = open(filePath, 'rb')
fileInfoDict = {
"file": fileFp,
}
resp = requests.post(uploadResultUrl, files=fileInfoDict)
Das ist alles.
Zur Verdeutlichung der oben angeführten Beispiele,
"Sie müssen den Parameter files verwenden, um eine mehrteilige POST-Anfrage zu senden, auch wenn Sie keine Dateien hochladen müssen.
files={}
wird leider nicht funktionieren.
Sie müssen einige Dummy-Werte einfügen, z. B.
files={"foo": "bar"}
Ich stieß auf dieses Problem, als ich versuchte, Dateien auf die REST-API von Bitbucket hochzuladen, und musste diese Abscheulichkeit schreiben, um den gefürchteten Fehler "Unsupported Media Type" zu vermeiden:
url = "https://my-bitbucket.com/rest/api/latest/projects/FOO/repos/bar/browse/foobar.txt"
payload = {'branch': 'master',
'content': 'text that will appear in my file',
'message': 'uploading directly from python'}
files = {"foo": "bar"}
response = requests.put(url, data=payload, files=files)
:O=
import json
import os
import requests
from requests_toolbelt import MultipartEncoder
AUTH_API_ENDPOINT = "http://localhost:3095/api/auth/login"
def file_upload(path_img, token ):
url = 'http://localhost:3095/api/shopping/product/image'
name_img = os.path.basename(path_img)
mp_encoder = MultipartEncoder(
fields={
'email': 'mcm9@gmail.com',
'source': 'tmall',
'productId': 'product_0001',
'image': (name_img, open(path_img, 'rb'), 'multipart/form-data')
#'spam': ('spam.txt', open('spam.txt', 'rb'), 'text/plain'),
}
)
head = {'Authorization': 'Bearer {}'.format(token),
'Content-Type': mp_encoder.content_type}
with requests.Session() as s:
result = s.post(url, data=mp_encoder, headers=head)
return result
def do_auth(username, password, url=AUTH_API_ENDPOINT):
data = {
"email": username,
"password": password
}
# sending post request and saving response as response object
r = requests.post(url=url, data=data)
# extracting response text
response_text = r.text
d = json.loads(response_text)
# print(d)
return d
if __name__ == '__main__':
result = do_auth('mcm4@gmail.com','123456')
token = result.get('data').get('payload').get('token')
print(token)
result = file_upload('/home/mcm/Pictures/1234.png',token)
print(result.json())