web-dev-qa-db-fra.com

Outil de ligne de commande Linux pour le téléchargement de fichiers via HTTP sous forme de multipart / form-data?

Je peux voir que wget a une option --post-file, mais la page de manuel indique que "Wget ne prend actuellement pas en charge les données multipart/form pour la transmission de données POST; seule application/x-www-form-urlencoded Un seul de '--post-data' et '--post-file' doit être spécifié. "

Existe-t-il une méthode similaire pour télécharger des fichiers multipart/form-data?

23
kdt

Utilisez curl:

curl -F "file=@localfile;filename=nameinpost" url.com
29
Tobu

Il est possible de faire cela avec wget seulement. 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 le fichier en base64, mais vous devez vous assurer que votre fichier ne contient pas de 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 post sont terminées par\r\n. La seule exception concerne les données contenues dans le contexte du fichier.
  2. Chaque attribut BOUNDARY dans la postdata doit correspondre à la valeur BOUNDARY de l'appel à wget. (FILEUPLOAD dans l'exemple)
  3. Toutes les limites sont précédées de deux tirets "-" et se terminent par\r\n
  4. La dernière limite est suffixée de 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 par une ligne vide "\ r\n"

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

16
tudor