2012-04-02 17 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 

जो कमांड के आउटपुट को लॉग फ़ाइल में जोड़ता है और इसे stdout पर भी गूंजता है। test ${PIPESTATUS[0]} -eq 0 भाग यह बनाता है कि इस लाइन की निकास स्थिति (जो एक बैश स्क्रिप्ट में है) एक ही निकास कोड है जो 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. 
+1

एनबी! डाउनलोड प्रगति के बारे में जानकारी प्राप्त करने के लिए 'tee' कमांड की आवश्यकता है। यदि आप 'टीई' का उपयोग नहीं करना चाहते हैं तो बस 'grep -v'^uniqueStringNeverHappens $ ''कमांड का उपयोग करें। अधिक जानकारी: http://stackoverflow.com/a/17178410/751932 – Speakus

+1

वैकल्पिक रूप से: '>/dev/null' – asymmetric

+0

यह मेरे लिए काम नहीं करता है :( संपादित करें: कभी नहीं, समस्या यह थी कि मैं चाहता था समय कितना समय लगता है, इसलिए मैंने 'टाइम कर्ल - प्रोग्रेस-बार --verbose ...' का उपयोग किया जो प्रगति पट्टी को दिखाए जाने से रोकता है। समय के बिना इसे चलाना काम करता है। –

8

मैं स्वीकार किए जाते हैं जवाब के आदेश पुनर्निर्देशन में समस्या आई और -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. 
3

अन्य सभी उत्तरों में समस्या है कि उन्हें आपको एक (लॉग) फ़ाइल में कर्ल के मूल आउटपुट को लिखने की आवश्यकता है। हालांकि यह सभी मामलों में नहीं चाहता था।

समस्या यह है कि कर्ल प्रगति बार/मीटर को छुपाता है, जब सर्वर प्रतिक्रिया की अपेक्षा की जाती है, जिसे एसडीओटी में लिखा जाता है। तो मूल रूप से बार को दिखाने के लिए आउटपुट को फ़ाइल में रीडायरेक्ट कर सकता है। हालांकि हम चाहते हैं कि नहीं करना चाहते, तो /dev/null और tee हमें यहाँ मदद कर सकते हैं:

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

कर्ल के उत्पादन tee जो कंसोल के लिए उत्पादन दोनों लिखते हैं (जो हम प्रगति बार देखना चाहते हैं और यह भी सर्वर से पारित हो जाता है प्रतिक्रिया) और एक फ़ाइल में (जिसे हमारे द्वारा जरूरी नहीं है, लेकिन जैसा कि हम /dev/null का उपयोग करते हैं, इससे कोई फर्क नहीं पड़ता)।

ध्यान दें कि पाठ्यक्रम के कर्ल देव ने मज़े के लिए प्रगति पट्टी को छुपाया नहीं है।इस मामले में आप हमेशा सर्वर परिणाम नहीं देख सकते हैं या इसे केवल कुछ सेकंड दिखाए जा सकते हैं, लेकिन यदि आपको इसकी परवाह नहीं है, तो समाधान एक अच्छा है।

संबंधित मुद्दे