【问题标题】:cURL: How to display progress information while uploading?cURL:如何在上传时显示进度信息?
【发布时间】:2022-05-07 22:37:44
【问题描述】:

我使用以下语法上传文件:

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

如何显示进度?谢谢。

【问题讨论】:

标签: curl


【解决方案1】:

这是我在我的一个构建脚本中使用的:

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

将命令的输出附加到日志文件,并将其回显到stdouttest ${PIPESTATUS[0]} -eq 0 部分使得该行的退出状态(在 bash 脚本中)与 curl 命令返回的退出代码相同,而不是 tee 命令的退出状态(这是必要的,因为 @ 987654332@ 实际上是这一行执行的最后一个命令,而不是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.

【讨论】:

  • 注意! tee 命令需要获取有关下载进度的信息。如果您不想使用tee,那么只需使用grep -v '^uniqueStringNeverHappens$' 命令。更多信息:stackoverflow.com/a/17178410/751932
  • 或者:&gt; /dev/null
  • 这似乎对我不起作用 :( 编辑:没关系,问题是我想计时需要多长时间,所以我使用了time curl --progress-bar --verbose ...,它可以防止显示进度条。没有时间运行它。
  • "如果您想要 HTTP POST 或 PUT 请求的进度表,您需要使用 shell 重定向 (>)、-o [file] 或类似方法将响应输出重定向到文件。"这应该被突出显示,每次都能得到我。
【解决方案2】:

这里的所有其他答案都有一个问题,它们要求您将 curl 的原始输出写入(日志)文件。然而,这可能并非在所有情况下都需要。

问题是 curl 隐藏进度条/仪表,当预期服务器响应时,然后将其写入标准输出。 所以基本上你可以将输出重定向到一个文件以再次显示该栏。但是我们不希望这样,所以/dev/nulltee 可以在这里帮助我们:

curl --progress-bar -T "${SOME_LARGE_FILE}" "${UPLOAD_URL}" | cat

Curl 的输出被传递给tee,它将输出写入控制台(我们希望看到进度条和服务器响应)和文件(我们不需要,但我们使用/dev/null 这没关系)。

请注意,curl 开发人员当然不会为了好玩而隐藏进度条。在这种情况下,您可能并不总是看到服务器结果,或者它可能只显示几秒钟(因为之后会再次显示进度条),但如果您不关心这一点,那么解决方案是一个不错的解决方案。

【讨论】:

  • 我认为他们只是为了好玩而将其隐藏起来,因为您明确要求使用 --progress-bar 提供进度条。
  • 为什么是curl --progress-bar ... | tee /dev/null?就我而言,curl --progress-bar ... | cat 似乎也能正常工作。
  • @user000001 当然,这更容易。谢谢。 :)
  • 你也可以简单地使用“tee”而不需要 /dev/null
【解决方案3】:

我在接受答案的命令重定向时遇到问题,发现-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.

【讨论】:

  • 谢谢! Omg 花了太长时间才弄清楚这一点。
  • 这应该是公认的答案。
  • 非常感谢!我一直在摸索进度条去了哪里?是的,重定向输出!!再次感谢!
  • 另外,如果只想看进度条,可以这样做: $ curl --progress-bar .... > /dev/null
  • 进度条与所有冗长的标准错误流分开怎么样?或者如何将进度条从标准错误移到标准输出?
【解决方案4】:

在 Windows 上显示进度条: curl --progress-bar --upload-file Myfile.zip "https://my.upload.site/Some/Upload/Path/Myfile.zip" |输入

【讨论】:

    【解决方案5】:

    谁想要将进度从标准错误转移到标准输出:

    curl ... -o ... ... 2>&1 | sed -E 's/\r([^\n])/\n\1/g' | grep -P '^(?:  [% ] |(?:  |  \d|\d\d)\d |[<>] )'
    

    tested on download

    sed 必须用于通过将CR 替换为LF 来忽略空白行。 这是在详细或非详细模式下统一解析 curl 输出所必需的。

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 2019-05-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多