cURL: как отображать информацию о прогрессе при загрузке? - PullRequest
34 голосов
/ 02 апреля 2012

Я использую следующий синтаксис для загрузки файлов:

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

Как отобразить прогресс?Thx.

Ответы [ 3 ]

57 голосов
/ 21 августа 2012

Это то, что я использую в одном из моих скриптов сборки:

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 и -A, вероятно, не будут вам интересны, но полезные части:

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

, который говорит curl показывать индикатор выполнения (вместо «индикатора прогресса» по умолчанию) во время загрузки, и:

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

, который добавляет вывод команды кфайл журнала, а также отобразить его на stdout.Часть test ${PIPESTATUS[0]} -eq 0 делает так, чтобы статус выхода этой строки (который находится в bash-скрипте) был таким же кодом выхода, который вернула команда curl, а не состоянием выхода команды tee (необходимо, потому что tee на самом деле является последней командой, выполняемой в этой строке, а не 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.
24 голосов
/ 25 января 2017

Все остальные ответы здесь имеют проблему с тем, что они требуют, чтобы вы записали исходный вывод curl в (log) файл. Однако это может быть нежелательным не во всех случаях.

Проблема в том, что curl скрывает индикатор выполнения / индикатор, когда ожидается ответ сервера, который затем записывается в стандартный вывод. Таким образом, вы можете перенаправить вывод в файл, чтобы снова показать панель. Однако мы не хотим этого, поэтому /dev/null и tee могут помочь нам здесь:

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

Вывод Curl передается в tee, который записывает вывод как в консоль (которую мы хотим видеть индикатор выполнения, а также в ответ сервера), так и в файл (который нам не нужен, но мы используем /dev/null это не имеет значения).

Обратите внимание, что разработчики curl, конечно же, не скрывали индикатор выполнения для развлечения. В этом случае здесь вы можете не всегда видеть результат работы сервера, или он может отображаться только в течение нескольких секунд (поскольку индикатор выполнения снова отображается снова), но если вам это не важно, решение будет хорошим.

24 голосов
/ 03 сентября 2016

У меня были проблемы с перенаправлением команды принятого ответа, и я обнаружил, что опция -o поместит вывод ответа в файл, который позволяет отображать индикатор выполнения.

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

Просто еще одна опция для полученияжелаемый результат.


ПРИМЕЧАНИЕ : Акцент на этой строке на странице руководства важен для понимания основной причины того, почему индикатор выполнения не отображается при указании --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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...