Linux-Kommandozeilen-Tool zum Hochladen von Dateien über HTTP als Multipart- / Formulardaten?

25

Ich kann sehen, dass wget eine --post-fileOption hat, aber die Manpage sagt

Wget unterstützt derzeit keine Multipart- / Formulardaten für die Übertragung von POST-Daten. nur application / x-www-form-urlencoded. Es sollte nur eines von --post-dataund --post-fileangegeben werden.

Gibt es eine ähnliche Möglichkeit zum Hochladen von Dateien in mehrteiligen / Formulardaten?

kdt
quelle

Antworten:

31

Verwenden Sie locken:

curl -F "file=@localfile;filename=nameinpost" url.com
Tobu
quelle
17

Dies ist nur mit wget möglich. Zumindest mit Version 1.13.4 und vielleicht anderen. Mit der Option --post-file können Sie eine zu sendende Datei angeben, sofern die Postdatendatei ordnungsgemäß erstellt wurde.

Ich habe dies auch mit Binärdateien getestet und es funktioniert wie erwartet. Sie müssen die Datei NICHT mit base64 codieren, aber Sie müssen sicherstellen, dass Ihre Datei keine Begrenzung enthält.

Der minimale Befehl, der benötigt wird, um diese Arbeit zu machen, wäre:

wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform

und die Postdata-Datei müsste etwas enthalten wie:

--FILEUPLOAD
Content-Disposition: form-data; name="comment"

I love uploading files!

--FILEUPLOAD
Content-Disposition: form-data; name="uploadFile"; filename="myfile.bin"; 
Content-Type: application/octet-stream
Media Type: application/octet-stream

Give me some automated file upload action!

--FILEUPLOAD--

Eine Reihe von Details sind hier wichtig:

  1. Zeilen in der Post-Datendatei werden mit \ r \ n abgeschlossen. Die einzige Ausnahme bilden Daten im Dateikontext.
  2. Jedes BOUNDARY-Attribut in den Postdaten muss mit dem BOUNDARY-Wert im Aufruf von wget übereinstimmen. (FILEUPLOAD im Beispiel)
  3. Allen Grenzen werden zwei Bindestriche "-" vorangestellt und mit \ r \ n abgeschlossen
  4. Die letzte Grenze wird mit zwei zusätzlichen Bindestrichen "-" versehen und mit \ r \ n abgeschlossen
  5. Jedes Datenelement, jeder Dateiinhalt oder jeder Parameterwert ist von einer leeren Zeile "\ r \ n" umgeben.

Ich dachte, dies könnte jemandem helfen, da einige kontrollierte Umgebungen wget, aber nicht wellig sind.

tu-Reinstate Monica-dor duh
quelle
Ich konnte nicht wget mit einer Binärdatei arbeiten. Ich habe den Textteil der Post-Datendatei erstellt, gespeichert, verwendet cat pic.jpg >> postdata, in Notepad ++ geladen und die letzte Grenze + '-' + EOL angehängt. W3C-Referenz
Chloe
@Chloe, ich musste dies für ein anderes Projekt überdenken, und dieses Mal wurden Binärdateien benötigt und es funktionierte wie erwartet. Ich habe eine einfache Seite zum Hochladen von PHP-Dateien erstellt und diese dann über einen Browser abgerufen, um die Dateigröße zu ermitteln und sie dann mit dem Ergebnis der Verwendung von wget zu vergleichen. Ich würde vorschlagen, dass Sie dasselbe tun, da ein streunender Zeilenumbruch dazu führen kann, dass der gesamte Prozess fehlschlägt.
Wiedereinsetzung von Monica-dor duh
1
Ein Semikolon fehlt. Es verursachte Probleme mit Python-Tornado --header = "Inhaltstyp: mehrteilig / Formulardaten; Grenze = FILEUPLOAD"
FlappySocks