379 Stimmen

Wie man ein "multipart/form-data" mit Anfragen in Python senden?

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.

8voto

Skiller Dz Punkte 849

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

5voto

Mohamed MosȜd Punkte 138
import requests
# assume sending two files
url = "put ur url here"
f1 = open("file 1 path", 'rb')
f2 = open("file 2 path", 'rb')
response = requests.post(url,files={"file1 name": f1, "file2 name":f2})
print(response)

4voto

crifan Punkte 10673

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.

4voto

RCross Punkte 4645

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=

4voto

user3012761 Punkte 41
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())

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X