Dies ist der beste Weg, dies zu tun. Die Alternative, -d @message.txtwie in der anderen Antwort vorgeschlagen, kann insbesondere Ihre Zeilenumbrüche ändern. --data-binaryAuf der anderen Seite nicht - was wichtig ist, wenn Sie Ihre CRLF-Zeilenumbrüche für mehrteilige / Formulardaten behalten müssen, siehe: stackoverflow.com/questions/10765243/… )
William Denniss
8
Weil ich eine Sekunde gebraucht habe: Wenn Sie eine Datei hochladen, möchten Sie wahrscheinlich eine Subshell dafür verwendencurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
Ich konnte --data-binary nicht zum Laufen bringen, konnte aber die Antwort% 0A (siehe @malcolmocean) verwenden. Wenn ich --data-binary "ip = 33.44.55. * \ N5.6.7.8" verwende, wird es nicht als Zeilenumbruch behandelt, sondern --data "" ip = 33.44.55. *% 0A5.6.7.8 "schickt die Newline durch
Paul
49
Ihre Muschel geht vorbei, \gefolgt von neiner neuen Linie, die sich eher kräuselt als "my message\n". Bash unterstützt eine andere Zeichenfolgensyntax, die Escape-Sequenzen wie \nund unterstützt \t. Um es zu verwenden, beginnen Sie die Zeichenfolge mit $'und beenden Sie die Zeichenfolge mit ':
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Das hat auch bei mir funktioniert. Ich muss damit herumspielen, weil es mit doppelten Anführungszeichen nicht funktioniert hat, was bedeutet, dass ich keine einfachen Anführungszeichen innerhalb der Zeichenfolge verwenden kann.
Tyler Collier
1
Ich weiß nicht, woher Sie diese Idee haben, dass dies "JavaScript-Shell-Syntax" ist. Die Shell geht my message\nwörtlich vorbei , nicht mit zwei Fluchten, wie Sie sagen.
Chris Down
@ ChrisDown, du hast mich falsch zitiert. Ich sagte "JavaScript-String-Syntax", nicht "JavaScript-Shell-Syntax". Ich verwende die JavaScript-Zeichenfolgensyntax, um klar zu machen, was ich mit meinen Zeichenfolgenbeispielen meine. Ich denke, was Sie als bezeichnen, my message\nist dasselbe wie das, worauf ich mich beziehe "my message\n".
Benjamin Atkin
2
@ BenAtkin Sorry, Freudian Slip. Meine Lesart war jedoch immer noch korrekt. \nhat nichts mit JavaScript zu tun. Tatsächlich hat hier überhaupt nichts mit JavaScript zu tun.
Chris Down
Ich benutze es, um es den Leuten zu erklären. Und es scheint funktioniert zu haben. Die Shell-String-Syntax ist nicht allgemein bekannt. Wenn ja, warum wäre diese Frage gestellt worden? Was hätte ich verwenden sollen, um es zu erklären?
Benjamin Atkin
16
Es gibt einen viel einfacheren Weg!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Ich habe Probleme, das zu verstehen. Ich verstehe, dass dies @einen Dateinamen angibt, aber gibt es eine besondere Bedeutung bei der Verwendung @-? Was <<EOFmacht das
Dennis T - Reinstate Monica -
1
@-Weist Curl an, Eingaben von Standard-In zu verbrauchen, und <<EOFist der Indikator für das Ende des Streams für Bash. Wir verwenden dann später das Zauberwort EOFin der Datennutzlast, um bash mitzuteilen, dass wir mit dem Schreiben in den Stream fertig sind.
Jammer
Auch -ist eine Art der Standardmethode in GNU / Linux STDIN angeben , wenn ein Dateiname erwartet wird. Es ist nicht universell, aber es ist ziemlich häufig.
Rich Remer
Wenn wir das Handbuch konsultieren, sehen wir, dass es nur - und nicht @ -
user3504575 sein sollte.
8
Hatte ein ähnliches Problem. Beim Hochladen der CSV-Datei vom Mac in den Cloud-Speicher wurden neue Zeilen entfernt. Nach dem Herunterladen sah die gesamte Datei wie eine einzelne Zeile aus. Ich habe versucht, verschiedene EOL-Zeichen '\ n' '\ r' '\ r \ n' ohne Erfolg hinzuzufügen. Die Verwendung von '--data-binary' anstelle von '-d' löste das Problem. Übrigens trat dieses Problem nur auf dem Mac auf. '-d' funktionierte einwandfrei, als der Anruf vom CentOS-Computer aus getätigt wurde. Dies sieht aufgrund des Newline-Charakters von Mac sehr ähnlich aus. Aber keine Lust mehr zu debuggen.
Vielen dank für Deine Hilfe.
curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"
VS
curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"
Vielen Dank ! Dies hängt nicht mit Ihrem Mac zusammen: Ich hatte genau das gleiche Problem unter Linux und die Verwendung --data-binary @hat mein Problem behoben (Senden einer mehrzeiligen .ics-Datei an einen CalDAV-Server).
M-Jack
7
(Ich bin hier mit einer etwas anderen Frage gelandet, daher werde ich nur meine Antwort veröffentlichen, da dies zukünftigen Entdeckern helfen könnte.)
Meine Lösung gilt für Personen, die Daten im Formularstil senden, dh Schlüssel / Wert-Paare in einer Abfragezeichenfolge. Verwenden Sie den codierten Zeilenumbruch %0A, genau wie ein codierter Leerzeichen %20. Sie können http://meyerweb.com/eric/tools/dencoder/ verwenden , um andere Symbole zu konvertieren.
Wenn Sie also den Schlüssel messageauf den Wert setzen möchten :
kleiner Kommentar (möglicherweise Tippfehler) für ein Zeilenumbruch- / Carraige-Rückkehrzeichen sollte% 0A statt% A0 sein
Paul
3
Keine Antwort auf Ihre Frage, aber ich würde sie umgehen, indem ich eine temporäre Datei mit der Nachricht und dem Zeilenumbruch erstelle und diese Datei zum Bearbeiten einrolle:
curl -X PUT -d @message.txt http://localhost:8000/hello
Wenn Sie die Daten mit dem Buchstaben @ beginnen, sollte der Rest ein Dateiname sein, aus dem die Daten gelesen werden sollen, oder - wenn Sie möchten, dass Curl die Daten aus stdin liest. Der Inhalt der Datei muss bereits URL-codiert sein. Es können auch mehrere Dateien angegeben werden. Das Posten von Daten aus einer Datei mit dem Namen "foobar" würde daher mit --data @foobar erfolgen.
Die Verwendung temporärer Dateien ist ein praktischer Ansatz. Laut Szocskes Antwort --data-binaryist dies eine getreuere Alternative zu -d, da die Daten wörtlich gesendet werden.
William Denniss
7
-1; Die Verwendung einer temporären Datei mit -d @/path/to/temp/file.txtlöst das Zeilenumbruchproblem NICHT. --data-binarytut, siehe oben.
Frank Olschewski
Wenn Sie dies sehen, weil Sie sich fragen, warum Ihre Curl-Befehle nach dem Upgrade von Curl oder Windows 10 nicht funktionieren, stellen Sie sicher, dass Sie Anführungszeichen um Ihre Dateireferenz setzen. Beispiel: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Meine Elasticsearch-Wiederherstellungsskripte funktionierten nicht mehr.
Joezen777
3
Ein sehr einfacher Weg, einfach Shift-Enter in der Konsole für die Pause. Sehr gut lesbar.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
Gehen Sie folgendermaßen vor, um den Zeilenumbruch zu entfernen:
\n\narbeitete in Google Mail, wurde aber \nignoriert. Ich habe versucht, die Flucht und andere Vorschläge zu verdoppeln. Ich habe es auch versucht \r\nund das hat auch in Google Mail nicht funktioniert. Hinweis: Ich habe mich nicht darum gekümmert, andere E-Mail-Clients zu testen. Möglicherweise handelte es sich um ein Google Mail-spezifisches Problem.
Schließlich gab ich die Suche nach einer Lösung auf und wechselte text/plainzu text/htmlund benutzte nur <br />Tags.
Jemand schlug vor, dass Sendgrid Klartext in HTML konvertiert, wenn Sie ein Tracking-Pixel aktiviert haben, was sinnvoll ist. Möglicherweise wurden die Zeilenumbrüche bei der Konvertierung von Klartext in HTML zerstört. Ich gehe davon aus, dass der Client ein Tracking-Pixel haben möchte, und entschied sich daher, auf HTML umzusteigen.
Antworten:
Manchmal möchten Sie die zu sendenden Daten wörtlich angeben.
Die
--data-binary
Option macht das.quelle
-d @message.txt
wie in der anderen Antwort vorgeschlagen, kann insbesondere Ihre Zeilenumbrüche ändern.--data-binary
Auf der anderen Seite nicht - was wichtig ist, wenn Sie Ihre CRLF-Zeilenumbrüche für mehrteilige / Formulardaten behalten müssen, siehe: stackoverflow.com/questions/10765243/… )curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
curl --data-binary @/path/to/file.txt http://example.com/target
Ihre Muschel geht vorbei,
\
gefolgt vonn
einer neuen Linie, die sich eher kräuselt als"my message\n"
. Bash unterstützt eine andere Zeichenfolgensyntax, die Escape-Sequenzen wie\n
und unterstützt\t
. Um es zu verwenden, beginnen Sie die Zeichenfolge mit$'
und beenden Sie die Zeichenfolge mit'
:Siehe ANSI-C-Angebot im Bash-Referenzhandbuch
quelle
my message\n
wörtlich vorbei , nicht mit zwei Fluchten, wie Sie sagen.my message\n
ist dasselbe wie das, worauf ich mich beziehe"my message\n"
.\n
hat nichts mit JavaScript zu tun. Tatsächlich hat hier überhaupt nichts mit JavaScript zu tun.Es gibt einen viel einfacheren Weg!
Dies verwendet ANSI-C-Anführungszeichen , um das Zeilenumbruchzeichen einzufügen.
Keine Rohrleitungen, keine Datendateien. Siehe auch Senden von Zeilenumbrüchen mit cURL .
quelle
Die Lösung für jemanden, der keine Dateien verwenden möchte und nicht auf Shell-Fluchtmagie zurückgreifen möchte, lautet:
Dies sind jedoch wörtliche Zeilenumbrüche in der Postdaten-Nutzlast und nicht in Formularfeldern.
quelle
@
einen Dateinamen angibt, aber gibt es eine besondere Bedeutung bei der Verwendung@-
? Was<<EOF
macht das@-
Weist Curl an, Eingaben von Standard-In zu verbrauchen, und<<EOF
ist der Indikator für das Ende des Streams für Bash. Wir verwenden dann später das ZauberwortEOF
in der Datennutzlast, um bash mitzuteilen, dass wir mit dem Schreiben in den Stream fertig sind.-
ist eine Art der Standardmethode in GNU / Linux STDIN angeben , wenn ein Dateiname erwartet wird. Es ist nicht universell, aber es ist ziemlich häufig.Hatte ein ähnliches Problem. Beim Hochladen der CSV-Datei vom Mac in den Cloud-Speicher wurden neue Zeilen entfernt. Nach dem Herunterladen sah die gesamte Datei wie eine einzelne Zeile aus. Ich habe versucht, verschiedene EOL-Zeichen '\ n' '\ r' '\ r \ n' ohne Erfolg hinzuzufügen. Die Verwendung von '--data-binary' anstelle von '-d' löste das Problem. Übrigens trat dieses Problem nur auf dem Mac auf. '-d' funktionierte einwandfrei, als der Anruf vom CentOS-Computer aus getätigt wurde. Dies sieht aufgrund des Newline-Charakters von Mac sehr ähnlich aus. Aber keine Lust mehr zu debuggen.
Vielen dank für Deine Hilfe.
VS
quelle
--data-binary @
hat mein Problem behoben (Senden einer mehrzeiligen .ics-Datei an einen CalDAV-Server).(Ich bin hier mit einer etwas anderen Frage gelandet, daher werde ich nur meine Antwort veröffentlichen, da dies zukünftigen Entdeckern helfen könnte.)
Meine Lösung gilt für Personen, die Daten im Formularstil senden, dh Schlüssel / Wert-Paare in einer Abfragezeichenfolge. Verwenden Sie den codierten Zeilenumbruch
%0A
, genau wie ein codierter Leerzeichen%20
. Sie können http://meyerweb.com/eric/tools/dencoder/ verwenden , um andere Symbole zu konvertieren.Wenn Sie also den Schlüssel
message
auf den Wert setzen möchten :du würdest senden
quelle
Keine Antwort auf Ihre Frage, aber ich würde sie umgehen, indem ich eine temporäre Datei mit der Nachricht und dem Zeilenumbruch erstelle und diese Datei zum Bearbeiten einrolle:
Aus dem Handbuch :
quelle
--data-binary
ist dies eine getreuere Alternative zu-d
, da die Daten wörtlich gesendet werden.-d @/path/to/temp/file.txt
löst das Zeilenumbruchproblem NICHT.--data-binary
tut, siehe oben.Ein sehr einfacher Weg, einfach Shift-Enter in der Konsole für die Pause. Sehr gut lesbar.
Gehen Sie folgendermaßen vor, um den Zeilenumbruch zu entfernen:
quelle
Ich habe Sendgrid mit diesem Code (unten kopiert) verwendet, der ursprünglich hier https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html gefunden wurde
\n\n
arbeitete in Google Mail, wurde aber\n
ignoriert. Ich habe versucht, die Flucht und andere Vorschläge zu verdoppeln. Ich habe es auch versucht\r\n
und das hat auch in Google Mail nicht funktioniert. Hinweis: Ich habe mich nicht darum gekümmert, andere E-Mail-Clients zu testen. Möglicherweise handelte es sich um ein Google Mail-spezifisches Problem.Schließlich gab ich die Suche nach einer Lösung auf und wechselte
text/plain
zutext/html
und benutzte nur<br />
Tags.Jemand schlug vor, dass Sendgrid Klartext in HTML konvertiert, wenn Sie ein Tracking-Pixel aktiviert haben, was sinnvoll ist. Möglicherweise wurden die Zeilenumbrüche bei der Konvertierung von Klartext in HTML zerstört. Ich gehe davon aus, dass der Client ein Tracking-Pixel haben möchte, und entschied sich daher, auf HTML umzusteigen.
quelle