Ich möchte cURL verwenden, um nicht nur Datenparameter in HTTP POST zu senden, sondern auch Dateien mit einem bestimmten Formularnamen hochzuladen. Wie soll ich das machen?
HTTP-Post-Parameter:
userid = 12345 filecomment = Dies ist eine Bilddatei
Hochladen der HTTP-Datei: Dateispeicherort = /home/user1/Desktop/test.jpg Formularname für Datei = Bild (entspricht $ _FILES ['Bild'] auf der PHP-Seite)
Ich habe einen Teil des Befehls cURL wie folgt dargestellt:
curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php
Das Problem, das ich bekomme, ist wie folgt:
Notice: Undefined index: image in /var/www/uploader.php
Das Problem ist, dass ich $ _FILES ['image'] verwende, um Dateien im PHP-Skript abzurufen.
Wie passe ich meine cURL-Befehle entsprechend an?
-d
Option, für die die Eingabe-URL codiert werden muss. Ich hätte das entfernen sollen, als ich die Antwort auf die-F
Option aktualisiert habe . Danke, dass du das verstanden hast.@
inimage=@/..
?Abrufen der Benutzer-ID als Pfadvariable (empfohlen):
Abrufen der Benutzer-ID als Teil des Formulars:
oder:
quelle
"Content-Type: multipart/form-data"
Hier ist meine Lösung, ich habe viele Beiträge gelesen und sie waren wirklich hilfreich. Schließlich habe ich Code für kleine Dateien mit cURL und PHP geschrieben, die ich für sehr nützlich halte.
Damit sollten wir auf der "api.endpoint.post" die folgenden vars posten. Sie können mit diesem Skript problemlos testen, und Sie sollten diese Debugs für die Funktion
postFile()
in der letzten Zeile erhalten.Es sollte gut funktionieren, es sind vielleicht bessere Lösungen, aber dies funktioniert und ist wirklich hilfreich, um zu verstehen, wie die MIME Boundary und Multipart / From-Data in PHP- und cURL-Bibliotheken funktioniert.
quelle
Wenn Sie eine Binärdatei wie CSV hochladen, verwenden Sie das folgende Format, um die Datei hochzuladen
quelle
--data-binary
instruiert ,curl
um nicht irgendeine Vorverarbeitung der Daten zu tun, im Gegensatz zu--data
Flagge. Um Ihren Kommentar direkt anzusprechen, beachten Sie, dass der Text ebenfalls binär ist, wir ihn jedoch als ASCII-Zeichen interpretieren können. Wenn Sie wirklich ein eindeutiges Beispiel wünschen, denken Sie an eine CSV, deren Felder Emoji enthalten. Ihre Bytes werden nicht direkt dem Text zugeordnetDas Problem, das mich hierher führte, stellte sich als grundlegender Benutzerfehler heraus - ich habe das nicht berücksichtigt
@
Zeichen nicht in den Pfad der Datei aufgenommen, und so hat curl den Pfad / Namen der Datei und nicht den Inhalt veröffentlicht. DerContent-Length
Wert war daher eher 8 als der Wert 479, den ich angesichts des Legten meiner Testdatei erwartet hatte.Der
Content-Length
Header wird automatisch berechnet, wenn Curl die Datei liest und veröffentlicht.curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/
... <Inhaltslänge: 479 ...
Veröffentlichen Sie dies hier, um anderen Neulingen in Zukunft zu helfen.
quelle
Alternativ dazu
curl
können Sie HTTPie verwenden , ein CLI-ähnliches cURL-ähnliches Tool für Menschen.Installationsanweisungen: https://github.com/jakubroztocil/httpie#installation
Dann renne:
quelle
So können Sie beliebige Dateinamen hochgeladener Dateien korrekt umgehen mit
bash
:quelle
Nach vielen Versuchen funktionierte dieser Befehl für mich:
quelle
Ich habe es mit diesem Befehl funktioniert
curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload
quelle