Outil de ligne de commande Linux pour télécharger des fichiers via HTTP en tant que multipart / form-data?

25

Je peux voir que wget a une --post-fileoption, mais la page de manuel dit

Wget ne prend actuellement pas en charge les données en plusieurs parties / formulaires pour la transmission de données POST; uniquement application / x-www-form-urlencoded. Un seul --post-dataet --post-filedoit être spécifié.

Existe-t-il un moyen similaire de télécharger des fichiers dans plusieurs parties / formulaires?

kdt
la source

Réponses:

31

Utilisez curl:

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

Il est possible de le faire uniquement avec wget. Au moins avec la version 1.13.4 et peut-être d'autres. L'option --post-file vous permet de spécifier un fichier à envoyer, tant que le fichier postdata est construit correctement.

J'ai également testé cela avec des fichiers binaires et cela fonctionne comme prévu. Vous n'avez PAS besoin de coder en base64 le fichier, mais vous devez vous assurer que votre fichier ne contient pas la limite.

La commande minimale requise pour faire ce travail serait:

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

et le fichier postdata devrait contenir quelque chose comme:

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

Un certain nombre de détails sont importants ici:

  1. Les lignes du fichier de données de publication se terminent par \ r \ n. La seule exception concerne les données dans le contexte du fichier.
  2. Chaque attribut BOUNDARY dans les postdata doit correspondre à la valeur BOUNDARY dans l'appel à wget. (FILEUPLOAD dans l'exemple)
  3. Toutes les limites sont préfixées par deux tirets "-" et terminées par \ r \ n
  4. La dernière limite est suffixée avec deux tirets supplémentaires "-" et se termine par \ r \ n
  5. Chaque donnée, contenu de fichier ou valeur de paramètre, est entourée d'une ligne vide "\ r \ n"

Je pensais que cela pourrait aider quelqu'un, car certains environnements contrôlés ont wget mais pas curl.

tu-Reinstate Monica-dor duh
la source
Je n'ai pas pu faire fonctionner wget avec un fichier binaire. J'ai créé la partie texte du fichier de données de publication, enregistré, utilisé cat pic.jpg >> postdata, chargé dans Notepad ++ et ajouté la dernière limite + '-' + EOL. Référence W3C
Chloé
@Chloe, j'ai dû revoir cela pour un autre projet, et cette fois, des fichiers binaires étaient nécessaires et j'ai trouvé que cela fonctionnait comme prévu. J'ai construit une simple page de téléchargement de fichiers php, puis je l'ai fait via un navigateur pour obtenir d'abord la taille du fichier, puis la comparer au résultat de l'utilisation de wget. Je vous suggère de faire de même, car une nouvelle ligne errante peut entraîner l'échec de l'ensemble du processus.
tu-Reinstate Monica-dor duh
1
Un point-virgule est manquant. Cela a causé des problèmes avec la tornade python --header = "Type de contenu: multipart / form-data; limite = FILEUPLOAD"
FlappySocks