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

Antworten:


254

Die folgende Syntax behebt das Problem für Sie:

curl -v -F key1=value1 -F upload=@localfilename URL

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

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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.