575 Stimmen

Verwendung von cURL zum Hochladen von POST-Daten mit Dateien

Ich möchte cURL verwenden, um nicht nur Datenparameter in HTTP POST zu senden, sondern auch Dateien mit bestimmten Formularnamen hochzuladen. Wie soll ich das anstellen?

HTTP-Post-Parameter:

Benutzerkennung = 12345 filecomment = Dies ist eine Bilddatei

HTTP Datei-Upload: Dateispeicherort = /home/user1/Desktop/test.jpg Formularname für die Datei = image (entspricht dem $_FILES['image'] auf der PHP-Seite)

Ich habe mir einen Teil des cURL-Befehls wie folgt vorgestellt:

curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php

Das Problem, das sich mir stellt, ist folgendes:

Notice: Undefined index: image in /var/www/uploader.php

Das Problem ist, dass ich $_FILES['image'] verwende, um Dateien im PHP-Skript abzuholen.

Wie kann ich meine cURL-Befehle entsprechend anpassen?

10voto

shonky linux user Punkte 5654

Das Problem, das mich hierher führte, erwies sich als grundlegender Benutzerfehler - ich hatte die @ Zeichen im Pfad der Datei, so dass curl den Pfad/Namen der Datei und nicht den Inhalt veröffentlichte. Die Content-Length Wert war also 8 und nicht 479, wie ich angesichts der Länge meiner Testdatei erwartet hatte.

Les Content-Length Header wird automatisch berechnet, wenn curl die Datei liest und postet.

curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/

... < Inhalt-Länge: 479 ...

Ich poste dies hier, um anderen Neulingen in Zukunft zu helfen.

5voto

Gianfranco P. Punkte 8844

Als Alternative zu curl können Sie verwenden HTTPie Es ist ein CLI, ein cURL-ähnliches Werkzeug für Menschen.

  1. Anweisungen zum Einbau: https://github.com/jakubroztocil/httpie#installation

  2. Dann rennen Sie:

    http -f POST http://localhost:4040/api/users username=johnsnow photo@images/avatar.jpg
    
    HTTP/1.1 200 OK
    Access-Control-Expose-Headers: X-Frontend
    Cache-control: no-store
    Connection: keep-alive
    Content-Encoding: gzip
    Content-Length: 89
    Content-Type: text/html; charset=windows-1251
    Date: Tue, 26 Jun 2018 11:11:55 GMT
    Pragma: no-cache
    Server: Apache
    Vary: Accept-Encoding
    X-Frontend: front623311
    
    ...

4voto

he shouyong Punkte 84
cat test.txt 

Datei test.txt Inhalt.

curl -v -F "hello=word" -F "file=@test.txt" https://httpbin.org/post

> POST /post HTTP/2
> Host: httpbin.org
> user-agent: curl/7.68.0
> accept: */*
> content-length: 307
> content-type: multipart/form-data; boundary=------------------------78a9f655d8c87a53
> 
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
* We are completely uploaded and fine
< HTTP/2 200 
< date: Mon, 15 Nov 2021 06:18:47 GMT
< content-type: application/json
< content-length: 510
< server: gunicorn/19.9.0
< access-control-allow-origin: *
< access-control-allow-credentials: true
< 
{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "file test.txt content.\n"
  }, 
  "form": {
    "hello": "word"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "307", 
    "Content-Type": "multipart/form-data; boundary=------------------------78a9f655d8c87a53", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.68.0", 
    "X-Amzn-Trace-Id": "Root=1-6191fbc7-6c68fead194d943d07148860"
  }, 
  "json": null, 
  "origin": "43.129.xx.xxx", 
  "url": "https://httpbin.org/post"
}

3voto

Shravan Hebbar Punkte 189

Ich habe es mit diesem Befehl zum Laufen gebracht curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload

2voto

Vladimir Panteleev Punkte 24299

Hier wird gezeigt, wie man beliebige Dateinamen von hochgeladenen Dateien korrekt mit bash :

#!/bin/bash
set -eu

f="$1"
f=${f//\\/\\\\}
f=${f//\"/\\\"}
f=${f//;/\\;}

curl --silent --form "uploaded=@\"$f\"" "$2"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X