2012-04-02 50 views
22

私はファイルをアップロードするには、次の構文を使用します。cURL:アップロード中に進捗情報を表示する方法は?

curl --form [email protected] --form press=OK [URL] 

進行状況を表示する方法は?どうも。

+3

http://curl.haxx.se/docs/manpage.html進捗状況のセクションを参照してください。私はあなたがファイルに出力をパイプする必要があると思うが、肯定的ではない。 – Corbin

+0

あなたはそうです。どうも! – Determinant

答えて

44

これは私が私のビルドスクリプトのいずれかで使用するものです。

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 
012また、ログファイルにコマンドの出力を追加し、

はエコーstdoutにそれをです。 (bashスクリプトである)、このラインの終了ステータスがteeが実際にある最後のコマンドであるため、curlコマンドが必要teeコマンド(の終了ステータスが返されていない同一の終了コードであるようtest ${PIPESTATUS[0]} -eq 0部分は、それなりますこの行で実行され、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. 
+1

NB! 'tee'コマンドはダウンロードの進行状況に関する情報を得るために必要です。 'tee'を使いたくない場合は' grep -v '^ uniqueStringNeverHappens $' 'コマンドを使います。 more info:http://stackoverflow.com/a/17178410/751932 – Speakus

+1

また、 '>/dev/null' – asymmetric

+0

これは私のためにはうまくいかないようです:( EDIT:問題は私が欲しかったことでしたどのくらい時間がかかりますので、 'curl --progress-bar --verbose ... 'を使ってプログレスバーが表示されないようにしました。 –

8

私は受け入れ答えのコマンドのリダイレクトとのトラブルがあったとプログレスバーが表示できるようにするファイルに応答出力を配置します-oオプションを発見しました。

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

希望の結果を得るためのもう1つのオプション。


:manページからこの行の重視は、ちょうど--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. 
3

他のすべての回答は、curlの元の出力を(ログ)ファイルに書き込む必要があるという問題があります。しかし、これはすべての場合には望ましくないかもしれない。

問題は、カールがその後、SDOUTに書き込まれているサーバーの応答が期待されているプログレスバー/メーターを、隠すことです。 基本的に出力をファイルにリダイレクトして、バーを再度表示することができます。しかし、我々はそれをしたいので、/dev/nullteeは、ここで私たちを助けることができません。

カールの出力はまた、我々はプログレスバーを表示したいコンソールに出力の両方を書き込み tee(およびサーバに渡され
curl --progress-bar -T "${SOME_LARGE_FILE}" "${UPLOAD_URL}" | tee /dev/null 

応答)およびファイルに(これは私たちが必要とするのではなく、我々は/dev/nullを使うと、これは問題ではありません)。当然のカール開発者は、楽しみのためにプログレスバーを非表示にしませんでした

注意。ここでは、サーバーの結果が常に表示されるとは限りません。数秒間しか表示されない場合もありますが、これについて気にしなければ、解決策は素晴らしいものです。