cURL: comment afficher les informations de progression lors du téléchargement?

j'utilise la syntaxe suivante pour télécharger des fichiers:

curl --form upload=@localfilename --form press=OK [URL]

comment afficher la progression? Thx.

27
demandé sur Determinant 2012-04-02 12:25:07

3 réponses

C'est ce que j'utilise dans un de mes scripts de compilation:

curl "${UPLOAD_URL}" \
    --progress-bar \
    --verbose \
    -F build="${BUILD}" \
    -F version="${VERSION}" \
    -F ipa="@${IPA};type=application/octet-stream" \
    -F assets="@-;type=text/xml" \
    -F replace="${REPLACE}" \
    -A "${CURL_FAKE_USER_AGENT}" \
    <<< "${ASSETS}" \
    | tee -a "${LOG_FILE}" ; test ${PIPESTATUS[0]} -eq 0

-F et -A les options ne seront probablement pas d'intérêt pour vous, mais les parties utiles sont:

curl "${UPLOAD_URL}" --progress-bar

qui dit curl pour afficher une barre de progression (au lieu de la valeur par défaut "de la barre de progression') lors de l'upload, et:

 | tee -a "${LOG_FILE}" ; test ${PIPESTATUS[0]} -eq 0

qui ajoute la sortie de la commande vers un fichier de log et aussi echo stdout. test ${PIPESTATUS[0]} -eq 0 partie fait en sorte que le statut de sortie de cette ligne (qui est dans un script bash) est le même code de sortie de la curl commande retournée et non l'état de sortie du tee commande (nécessaire car tee est en fait la dernière commande exécutée dans cette ligne, pas curl).


man curl:

PROGRESS METER
       curl normally displays a progress meter during operations, indicating the amount of transferred data, transfer speeds and estimated time left, etc.

       curl  displays  this  data to the terminal by default, so if you invoke curl to do an operation and it is about to write data to the terminal, it disables the progress meter as otherwise it would mess up the
       output mixing progress meter and response data.

       If you want a progress meter for HTTP POST or PUT requests, you need to redirect the response output to a file, using shell redirect (>), -o [file] or similar.

       It is not the same case for FTP upload as that operation does not spit out any response data to the terminal.

       If you prefer a progress "bar" instead of the regular meter, -# is your friend.

OPTIONS
       -#, --progress-bar
              Make curl display progress as a simple progress bar instead of the standard, more informational, meter.
47
répondu chown 2012-08-21 00:00:23

j'ai eu des problèmes avec la redirection de commande de la réponse acceptée et j'ai trouvé le -o option aura lieu la sortie de la réponse dans un fichier qui permet à la barre de progression.

curl --progress-bar \ 
     -o upload.txt \
     -H ${SOME_AUTH_HEADER} \
     -T ${SOME_LARGE_FILE} \
     "${UPLOAD_URL}"

Juste une autre option pour obtenir le résultat souhaité.


NOTE: mettre L'accent sur cette ligne à partir de la page de manuel est important pour comprendre la cause fondamentale de pourquoi la barre de progression ne s'affiche pas en spécifiant simplement --progress-bar.

      If you want a progress meter for HTTP POST or PUT requests, 
      you need to redirect the response output to a file, 
      using shell redirect (>), -o [file] or similar.
15
répondu Martin Woolstenhulme 2016-09-03 01:22:10

toutes les autres réponses ici ont le problème qu'elles exigent que vous écriviez la sortie originale de curl dans un fichier (log). Cela peut toutefois ne pas être souhaitable dans tous les cas.

le problème est que curl cache la barre de progression/mètre, quand une réponse du serveur est attendue, qui est alors écrite dans sdout. Donc, fondamentalement, vous pouvez rediriger la sortie vers un fichier pour afficher la barre de nouveau. Mais nous ne le voulons pas, donc!--1--> et tee peut nous aider ici:

curl --progress-bar -T "${SOME_LARGE_FILE}" "${UPLOAD_URL}" | tee /dev/null

sortie de Curl est passé à tee qui écrit la sortie à la fois sur la console (que nous voulons voir la barre de progression et aussi la réponse du serveur) et dans un fichier (qui n'est pas nécessaire par nous, mais comme nous utilisons /dev/null cela n'a pas d'importance).

notez que le curl devs n'a pas caché la barre de progression pour le plaisir. Dans ce cas, il se peut que vous ne voyiez pas toujours le résultat du serveur ou qu'il ne soit affiché que quelques secondes, mais si vous ne vous en souciez pas, la solution est bonne.

11
répondu rugk 2018-04-08 12:47:43