477 votes

Utilisation de cURL pour télécharger des données POST avec des fichiers

Je voudrais utiliser cURL pour non seulement envoyer des paramètres de données dans HTTP POST mais aussi pour télécharger des fichiers avec un nom de formulaire spécifique. Comment dois-je m'y prendre ?

Paramètres HTTP Post :

identifiant = 12345 filecomment = Ceci est un fichier image

Téléchargement de fichiers HTTP : Emplacement du fichier = /home/user1/Desktop/test.jpg Nom de formulaire pour le fichier = image (correspond au $_FILES['image'] du côté PHP)

J'ai compris une partie de la commande cURL comme suit :

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

Le problème que je rencontre est le suivant :

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

Le problème est que j'utilise $_FILES['image'] pour récupérer les fichiers dans le script de PHP.

Comment puis-je adapter mes commandes cURL en conséquence ?

7voto

shonky linux user Points 2524

Le problème qui m'a conduit ici s'est avéré être une erreur d'utilisation de base - je n'incluais pas l'icône de l'utilisateur. @ dans le chemin du fichier et donc curl affichait le chemin/nom du fichier plutôt que son contenu. Le site Content-Length était donc de 8 au lieu des 479 auxquels je m'attendais compte tenu de la longueur de mon fichier de test.

Le site Content-Length sera automatiquement calculé lorsque curl lira et affichera le fichier.

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

... < Content-Length : 479 ...

Je poste ce message ici pour aider les autres débutants à l'avenir.

5voto

GianPaJ Points 1749

Comme alternative à curl vous pouvez utiliser HTTPie il s'agit d'un outil CLI, de type cURL, pour les humains.

  1. Instructions d'installation : https://github.com/jakubroztocil/httpie#installation

  2. Alors, cours :

    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
    
    ...

3voto

he shouyong Points 41
cat test.txt 

fichier test.txt contenu.

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"
}

2voto

CyberShadow Points 13244

Voici comment échapper correctement les noms de fichiers arbitraires des fichiers téléchargés avec bash :

#!/bin/bash
set -eu

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

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

2voto

Shraavan Hebbar Points 179

J'ai réussi à le faire fonctionner avec cette commande curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X