Je voudrais utiliser cURL pour envoyer non seulement 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 procéder?
Paramètres de publication HTTP:
userid = 12345 filecomment = Ceci est un fichier image
Téléchargement de fichier HTTP: Emplacement du fichier = /home/user1/Desktop/test.jpg Nom du formulaire pour file = image (correspond à $ _FILES ['image'] du côté PHP)
J'ai figuré 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 des fichiers dans le script PHP.
Comment ajuster mes commandes cURL en conséquence?
-d
option par erreur, qui a besoin de l'URL d'entrée encodée. J'aurais dû supprimer cela lorsque j'ai mis à jour la réponse à l'-F
option. Merci d'avoir attrapé ça.@
dansimage=@/..
?Attraper l'ID utilisateur en tant que variable de chemin (recommandé):
Attraper l'ID utilisateur dans le cadre du formulaire:
ou:
la source
"Content-Type: multipart/form-data"
Voici ma solution, j'ai lu beaucoup de messages et ils ont été vraiment utiles. Enfin, j'ai écrit du code pour les petits fichiers, avec cURL et PHP que je pense que c'est vraiment utile.
Avec cela, nous devrions être sur le "api.endpoint.post" les vars suivants postés. Vous pouvez facilement tester avec ce script, et vous devriez recevoir ce débogage sur la fonction
postFile()
à la dernière ligne.Cela devrait bien fonctionner, ils peuvent être de meilleures solutions, mais cela fonctionne et est vraiment utile pour comprendre comment fonctionne le mime Boundary et multipart / from-data sur PHP et la bibliothèque cURL.
la source
si vous téléchargez un fichier binaire tel que csv, utilisez le format ci-dessous pour télécharger le fichier
la source
--data-binary
indiquecurl
de ne pas effectuer de prétraitement des données, par opposition à--data
flag. pour adresser votre commentaire directement, notez que le texte est également binaire, mais nous pouvons l'interpréter comme des caractères ASCII. Si vous voulez vraiment un exemple distinct, pensez à un CSV dont les champs contiennent des emoji. Leurs octets ne correspondent pas directement au texteLe problème qui m'a conduit ici s'est avéré être une erreur utilisateur de base - je n'incluais pas le
@
signe dans le chemin du fichier et donc curl publiait le chemin / nom du fichier plutôt que le contenu. LaContent-Length
valeur était donc de 8 plutôt que du 479 que je m'attendais à voir étant donné la longueur de mon fichier de test.L'en-
Content-Length
tête sera automatiquement calculé lorsque curl lit et publie le fichier.curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/
... <Longueur du contenu: 479 ...
L'afficher ici pour aider d'autres débutants à l'avenir.
la source
Comme alternative à
curl
, vous pouvez utiliser HTTPie , c'est une CLI, un outil semblable à cURL pour les humains.Instructions d'installation: https://github.com/jakubroztocil/httpie#installation
Ensuite, exécutez:
la source
Après beaucoup d'essais, cette commande a fonctionné pour moi:
la source
Voici comment échapper correctement les noms de fichiers arbitraires des fichiers téléchargés avec
bash
:la source
Je l'ai fait fonctionner avec cette commande
curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload
la source