Wie kann ich eine Datei mit `curl` anstelle des Formulars hochladen?

Ich habe einen Kunden, dessen Kunde eine Drittanbieter-Clearingstelle verwendet, um Rechnungen zu erhalten. Wir können dies manuell tun, indem wir unsere Daten in XML exportieren, auf eine bestimmte Website gehen und die Datei hochladen. Das relevante HTML-Formular sieht folgendermaßen aus:

<form border=0
      method="POST"
      action="/server?request=send"
      enctype="multipart/form-data"
      id="uploadform"
      name="uploadform"
      onsubmit="return checkUpload()">
  <H2>Upload</H2>
  <p>Server directory:<br>
  <input type="text"
         id="directory"
         name="directory"
         value="./"
         size="30"></p>
  <p>Local file to be uploaded:<br>
  <input type="file"
         id="file"
         name="file"
         size="40"></p>
  <p><input type="submit" value="Send"></p>
</form>

Manuelle Übermittlung über die Weboberfläche funktioniert einwandfrei. Ich versuche, ein schnelles Tool zu schreiben, das das Formular mit curl für uns sendet. Ich habe viele verschiedene Versuche versucht, aber bisher jeder, obwohl ich eine "Datei" bekomme erfolgreich hochgeladen " HTML-Antwort, die Datei, die sie erhalten, ist leer.

Wir haben ursprünglich versucht, curl zu verwenden, weil die Clearinghouse Company dies vorgeschlagen hat. Das Beispiel, das sie gaben, war folgendes:

curl -i -k -H "Content-Type:application/octet-stream" \
  -d @test.txt -u username:password \
  https://example.com/server?request=send?filename=test.txt?directory=DX001

Als das nicht funktionierte, begann ich, mir den Code im obigen Formular anzusehen, und versuchte Folgendes (im selben Verzeichnis wie die XML-Datei):

curl -F "request=send" -F "directory=DX001" -F "file=33823.xml" \
  -u username:password -F "enctype=\"multipart/form-data\"" \
  -F "id=\"uploadform\"" https://example.com/server

Als das nicht funktionierte, dachte ich, ich würde den absoluten Pfad versuchen, obwohl ich im selben war directory:

curl -F "request=send" -F "directory=DX001" -F "file=/Users/chuck/Desktop/33823.xml" \
  -u username:password -F "enctype=\"multipart/form-data\"" \
  -F "id=\"uploadform\"" https://example.com/server

Jeder einzelne von diesen lädt nur eine leere Datei hoch (mit dem Namen der angegebenen Datei).

Wie Sie wahrscheinlich aus dem vollständigen Pfad ersehen können, mache ich dies von macOS aus, falls dies relevant ist.

Beachten Sie, dass die Aktion onsubmit im Formular einfach sicherstellt, dass weder die Eingaben directory noch die Eingaben file leer sind.

 2
Author: Chuck, 2018-07-10

1 answers

Jeder einzelne von diesen lädt nur eine leere Datei hoch (mit dem Namen der angegebenen Datei).

Curl weiß nicht welche Felder regulärer Text sind und welche Datei-Upload sind; es geht von ersterem aus, es sei denn, Sie sagen ihm ausdrücklich, dass er letzteres tun soll. Um eine ganze Datei anzuhängen, benötigen Sie das Präfix @:

-F "file=@/Users/chuck/Desktop/33823.xml"

Sie können dem Server einen anderen Dateinamen wie diesen geben:

-F "file=@\"/Users/chuck/Desktop/temp.xml\";filename=\"33823.xml\""

Der richtige vollständige Befehl sollte sein:

curl -u username:password \
     -F "directory=DX001" \
     -F "file=@/Users/chuck/Desktop/33823.xml" \
     https://example.com/server?request=send

Beachten Sie, wie request=send ist nicht Teil der Formulardaten; es war vorher Teil der URL, es ist jetzt immer noch Teil der URL. Obwohl Ihre Beispiele alle -u für die Authentifizierung enthalten, denken Sie daran, dass dies nur für den HTTP-Basismechanismus funktioniert, nicht für für Formular - /Cookie-basierte Anmeldeseiten.

 3
Author: user1686,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-07-24 19:54:00