Was ist der richtige Weg, um Multipart- / Formulardaten mithilfe von Curl zu POSTEN?

164

Ich habe diese Syntax verwendet, um eine Datei zusammen mit einigen Parametern zu veröffentlichen:

curl -v -include --form "key1=value1" --form upload=localfilename URL

Die Datei ist ungefähr 500 KB groß. Zunächst sehe ich auf der Sendeseite eine Inhaltslänge von 254. Später beträgt die Inhaltslänge der Serverantwort 0. Wo gehe ich falsch?

Hier ist die vollständige Ablaufverfolgung des Befehls.

* Couldn't find host xxx.xxx.xxx.xxx in the _netrc file; using defaults
* About to connect() to xxx.xxx.xxx.xxx port yyyy (#0)
*   Trying xxx.xxx.xxx.xxx...
* Adding handle: conn: 0x4b96a0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x4b96a0) send_pipe: 1, recv_pipe: 0
* Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) port yyyy (#0)
* POST /zzzzzz/UploadFile HTTP/1.1
* User-Agent: curl/7.32.0
* Host: xxx.xxx.xxx.xxx:yyyy
* Accept: */*
* Content-Length: 254
* Expect: 100-continue
* Content-Type: multipart/form-data; boundary=------------------------948a6137eef50079
*
* HTTP/1.1 100 Continue
* HTTP/1.1 100 Continue

* HTTP/1.1 200 OK
* HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
* Server: Apache-Coyote/1.1
* Server: Apache-Coyote/1.1
* Added cookie JSESSIONID="C1D7DD042E250211D9DEA82688876F88" for domain xxx.xxx.xxx.xxx, path /zzzzz/, expire 0
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/;
* HttpOnly
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/; HttpOnly
* Content-Type: text/html;charset=ISO-8859-1
Content-Type: text/html;charset=ISO-8859-1
* Content-Length: 0
* Content-Length: 0
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Connection #0 to host xxx.xxx.xxx.xxx left intact
Kamalakshi
quelle
Mögliches Duplikat von Verwenden von Curl zum Hochladen von POST-Daten mit Dateien
Ciro Santilli 法轮功 冠状 病 病 六四 法轮功

Antworten:

254

Die folgende Syntax behebt das Problem für Sie:

curl -v -F key1=value1 -F upload=@localfilename URL
Kamalakshi
quelle
Was ist mit Windows & curl.exe?
Piotr
1
Was ist mit mehreren Anhängen?
Hellboy
8
Es funktioniert unter Windows genauso und es unterstützt mehrere "Anhänge" / Dateien: Fügen Sie einfach weitere -F-Instanzen hinzu!
Daniel Stenberg
Diese Antwort enthält ein gutes Beispiel für das Hochladen mehrerer Dateien. stackoverflow.com/questions/11599957/…
bmoran
Das funktioniert. Auf Curl müssen wir so etwas nicht hinzufügen:-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
Emily
19

Um eine Datei mit Curl in Windows hochzuladen, stellte ich fest, dass für den Pfad doppelte Anführungszeichen erforderlich sind

z.B

curl -v -F 'upload=@\"C:/myfile.txt\"' URL
Logan Scott
quelle
1
Diese Antwort hat mir sehr geholfen. Obwohl ich in meinem Fall nicht entkommen sollte ", sollte ich es in meinem Fall auf einem Mac wie folgt senden curl -X POST -F key1=value1 -F 'image=@"/Users/ivkremer/Downloads/file name.jpg"'.
ivkremer
In meinem Fall - Ich hatte eine erfolgreiche Übertragung ohne Anführungszeichen: curl -v -F file=@/Users/path/to/file/testq.jpg 192.168.0.101:8080/upload-image
chatlanin
In meinem Fall unter Windows konnte ich die einfachen Anführungszeichen nicht verwenden und musste curl -F "filename=@\"C:\temp\file.jpg\"" https://someurl.com
solche
5

Das hat bei mir funktioniert

curl -F file=@filename URL
smac89
quelle
1

Es fiel mir schwer, eine mehrteilige HTTP-PUT-Anfrage curlan ein Java-Backend zu senden . Ich habe es einfach versucht

curl -X PUT URL \
   --header 'Content-Type: multipart/form-data; boundary=---------BOUNDARY' \
   --data-binary @file

und der Inhalt der Datei war

-----------BOUNDARY
Content-Disposition: form-data; name="name1"
Content-Type: application/xml;version=1.0;charset=UTF-8

<xml>content</xml>
-----------BOUNDARY
Content-Disposition: form-data; name="name2"
Content-Type: text/plain

content
-----------BOUNDARY--

aber ich habe immer den Fehler bekommen, dass die Grenze falsch war. Nach einigem Java-Backend-Debugging stellte ich fest, dass die Java-Implementierung \r\n--der Grenze ein Präfix hinzufügte , also nachdem ich meine Eingabedatei in geändert hatte

                          <-- here's the CRLF
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY--     <-- added '--' at the beginning

alles funktioniert gut!

tl; dr

Fügen Sie \r\nam Anfang des mehrteiligen Grenzinhalts und --am Anfang der Grenzen eine neue Zeile (CRLF ) hinzu und versuchen Sie es erneut.

Möglicherweise senden Sie eine Anfrage an ein Java-Backend, das diese Änderungen an der Grenze benötigt.

Lusk116
quelle
Beim Kopieren von POST-Daten mit der Firefox-Webkonsole habe ich auch festgestellt, dass sie \nanstelle von verwendet wurden \r\n. Sogar die Mitmproxy-Kopie als cURL wurde verwendet, \nsodass ich die Rohanforderung mit Mitmproxy kopieren musste. Ich habe mit hexdump gesehen, dass stattdessen Hex-Code 0Averwendet wurde 0D 0A.
Taufe
das \r\nist erforderlich. Schauen Sie sich tools.ietf.org/html/rfc2046#section-5.1.1 Seite 19.
Adam Zahran
0

Unter Windows 10, Curl 7.28.1 in Powershell, hat Folgendes für mich funktioniert:

$filePath = "c:\temp\dir with spaces\myfile.wav"
$curlPath = ("myfilename=@" + $filePath)
curl -v -F $curlPath URL
Matt
quelle