Senden Sie eine POST-Anfrage mit den in der Datei angegebenen Daten über Curl

239

Ich muss eine POST-Anfrage über Curl über die Befehlszeile stellen. Die Daten für diese Anforderung befinden sich in einer Datei. Ich weiß, dass dies über PUT mit der --upload-fileOption möglich ist.

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"
züchten
quelle
Überprüfen Sie meine Antwort, stackoverflow.com/questions/6213509/send-json-post-using-php/…
Muhammad Zeeshan
1
Tut mir leid, vielleicht habe ich mein Problem fälschlicherweise beschrieben. Ich muss eine Anfrage nicht über PHP-Curl senden, sondern nur über den Curl-Befehl von der Kommandozeile von Linux OS.
züchten

Antworten:

359

Sie suchen nach dem --data-binaryArgument:

curl -i -X POST host:port/post-file \
  -H "Content-Type: text/xml" \
  --data-binary "@path/to/file"

Druckt im obigen Beispiel -ialle Überschriften aus, damit Sie sehen können, was los ist, und -X POSTmacht deutlich, dass dies ein Beitrag ist. Beide können sicher weggelassen werden, ohne das Verhalten auf dem Draht zu ändern. Dem Pfad zur Datei muss ein @Symbol vorangestellt sein , damit curlSie aus einer Datei lesen können.

Richard J.
quelle
@ ɢʜʘʂʈʀɛɔʘɴ in diesem Fall wäre es.xml
dennismonsewicz
52
Das @Teil ist extrem wichtig!
Ron Klein
Wir verwenden also den Parameter --data-binary, aber der eigentliche Dateiinhalt kann Text sein? Da XML normalerweise nicht binär ist.
David
8
Eigentlich können Sie nur -d Flagge verwenden
Anatoly Yakimchuk
16
@ Tol182 -dwird dazu führen curl, dass Zeilenumbrüche entfernt werden, aber --data-binarynicht.
Acumenus
43

Ich muss eine POST-Anfrage über Curl über die Befehlszeile stellen. Die Daten für diese Anfrage befinden sich in einer Datei ...

Alles, was Sie tun müssen, ist, das --dataArgument mit einem @: zu beginnen.

curl -H "Content-Type: text/xml" --data "@path_of_file" host:port/post-file-path

Wenn Sie beispielsweise die Daten in einer Datei namens haben stuff.xml, würden Sie Folgendes tun:

curl -H "Content-Type: text/xml" --data "@stuff.xml" host:port/post-file-path

Der stuff.xmlDateiname kann mit einem relativen oder vollständigem Pfad zur Datei ersetzt werden: @../xml/stuff.xml, @/var/tmp/stuff.xml...

Grau
quelle
2
Falls Sie ein benanntes Feld senden müssen, können Sie es auch verwenden --data "name@stuff".
Hermann
15

Wenn Sie zum Hochladen von Dateien Formulardaten verwenden, in denen ein Parametername angegeben werden muss, können Sie Folgendes verwenden:

curl -X POST -i -F "parametername=@filename" -F "additional_parm=param2" host:port/xxx

Lucas Liu
quelle
Danke dir! Die 1. Lösung hat bei mir nicht funktioniert. parametername=hat mir wirklich geholfen :)
Cyborg
3

Die meisten Antworten sind hier perfekt, aber als ich wegen meines speziellen Problems hier gelandet bin, muss ich eine Binärdatei (XLSX-Tabelle) mithilfe der POST-Methode hochladen. Eines fehlt , dh normalerweise ist es nicht nur die Datei, die Sie laden mehr Formulardatenelemente , wie Kommentar zu Datei oder Tags zu Datei usw., wie es mein Fall war. Daher möchte ich es hier hinzufügen, da es mein Anwendungsfall war, damit es anderen helfen kann.

curl -POST -F comment=mycomment -F file_type=XLSX -F file_data=@/your/path/to/file.XLSX http://yourhost.example.com/api/example_url
Roter Junge
quelle