कर्ल का उपयोग करके एक बड़ी फ़ाइल डाउनलोड करना


87

मुझे कर्ल का उपयोग करके दूरस्थ फ़ाइल डाउनलोड करने की आवश्यकता है।

यहाँ मेरे पास नमूना कोड है:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$st = curl_exec($ch);
$fd = fopen($tmp_name, 'w');
fwrite($fd, $st);
fclose($fd);

curl_close($ch);

लेकिन यह बड़ी फ़ाइलों को संभाल नहीं सकता है, क्योंकि यह पहले मेमोरी को पढ़ता है।

क्या डिस्क पर फ़ाइल को सीधे स्ट्रीम करना संभव है?

जवाबों:


168
<?php
set_time_limit(0);
//This is the file where we save the    information
$fp = fopen (dirname(__FILE__) . '/localfile.tmp', 'w+');
//Here is the file we are downloading, replace spaces with %20
$ch = curl_init(str_replace(" ","%20",$url));
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
// write curl response to file
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// get curl response
curl_exec($ch); 
curl_close($ch);
fclose($fp);
?>

5
अपनी टिप्पणी @ Yes123 की रक्षा करें, मुझे जानने में दिलचस्पी है।
जुरगेन पॉल

8
अगर मैं गलत हूं तो मुझे सुधारें, लेकिन मुझे नहीं लगता कि आप वास्तव fwriteमें डेटा को मैन्युअल रूप से उपयोग करना चाहते हैं CURLOPT_FILE
साशा चेदिगोव 18

1
जैसा कि @SashaChedygov ने ऊपर बताया है, आपको fwriteAND का उपयोग करने की आवश्यकता नहीं है CURLOPT_FILE। पास करना $fpकाफी है। मैंने दोनों किया और 1फ़ाइल में सामग्री के अंत में समाप्त हो गया ।
पेपरलीक

@Sasha Chedygov ~ हाँ तुम न की जरूरतfwrite
एलिरेज़ा

5
ऐसा प्रतीत होता है कि CURLOPT_RETURNTRANSFER सेट करने से पहले CURLOPT_FILE सेट करना संभव नहीं है, क्योंकि CURLOPT_FILE CURLOPT_RETURNTRANSFER सेट होने पर निर्भर करता है। php.net/manual/en/function.curl-setopt.php#99082
नबी

25

मैं इस आसान फ़ंक्शन का उपयोग करता हूं:

इसे 4094 बाइट स्टेप के साथ डाउनलोड करने से यह आपकी मेमोरी को फुल नहीं करेगा

function download($file_source, $file_target) {
    $rh = fopen($file_source, 'rb');
    $wh = fopen($file_target, 'w+b');
    if (!$rh || !$wh) {
        return false;
    }

    while (!feof($rh)) {
        if (fwrite($wh, fread($rh, 4096)) === FALSE) {
            return false;
        }
        echo ' ';
        flush();
    }

    fclose($rh);
    fclose($wh);

    return true;
}

उपयोग:

     $result = download('http://url','path/local/file');

आप तब देख सकते हैं कि सब कुछ ठीक है या नहीं:

     if (!$result)
         throw new Exception('Download error...');

1
@ जब भी आप http त्रुटि को fopen()झूठा और समय पर वापस लौटते समय पकड़ लेते हैं, तो आप इसे लूप में डालते हैं (कॉल करें time()और गणित करें)
सिल्वियू-मैरियन

2
CURL के पास पहले से ही इसका कार्यान्‍वयन कार्य है (स्‍वीकृत उत्‍तर देखें), आप खुद ही कुछ क्‍यों लागू करना चाहेंगे?
पेट्र पेलर

2
क्योंकि cURL प्रक्रियात्मक इंटरफ़ेस बहुत खराब है
गतिशील

इसके लायक क्या है, मैं stream_copy_to_streamसामग्री को मैन्युअल रूप से कॉपी करने के बजाय उपयोग कर रहा हूं , एक छोटा कोड बनाता है। न तो यह और न ही यह काम करता है https(जब तक कि आप कोई वजीफा न दें $context)। प्रक्रियात्मक शैली के बारे में - फ़ाइल फ़ंक्शंस भी बहुत ओओपी नहीं हैं, और यदि आप एक सरणी में कर्ल विकल्प डालते हैं, तो यह वैसे भी क्लीनर होगा।
ashein

मैंने इसे एक https के साथ परीक्षण किया, महान काम करता है !!!, आपके लिए धन्यवाद @dynamic मदद करता है।
ओजाल जरबलीव

6

यदि आप निर्दिष्ट URL की सामग्री को डाउनलोड करना चाहते हैं, तो नीचे दिए गए कोड को भी एक फ़ाइल में सहेजना चाहते हैं।

<?php
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL,'http://news.google.com/news?hl=en&topic=t&output=rss');

$fp = fopen('rss.xml', 'w+');
/**
* Ask cURL to write the contents to a file
*/
curl_setopt($ch, CURLOPT_FILE, $fp);

curl_exec ($ch);

curl_close ($ch);
fclose($fp);
?>

यदि आप FTP सर्वर से फाइल डाउनलोड करना चाहते हैं तो आप php FTP एक्सटेंशन का उपयोग कर सकते हैं। कृपया नीचे कोड खोजें:

<?php
$SERVER_ADDRESS="";
$SERVER_USERNAME="";
$SERVER_PASSWORD="";
$conn_id = ftp_connect($SERVER_ADDRESS);

// login with username and password
$login_result = ftp_login($conn_id, $SERVER_USERNAME, $SERVER_PASSWORD);

$server_file="test.pdf" //FTP server file path 
$local_file = "new.pdf"; //Local server file path 

##----- DOWNLOAD $SERVER_FILE AND SAVE TO $LOCAL_FILE--------##
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
    echo "Successfully written to $local_file\n";
} else {
    echo "There was a problem\n";
}

ftp_close($conn_id);
?>

4

जब curlकिसी बड़ी फ़ाइल को डाउनलोड करने के लिए उपयोग किया जाता CURLOPT_TIMEOUTहै तो मुख्य विकल्प आपको निर्धारित करना होता है।

CURLOPT_RETURNTRANSFER अगर आपको पीडीएफ / सीएसवी / छवि आदि जैसी फाइल मिल रही है तो यह सच होना चाहिए।

आप यहाँ पर आगे का विवरण पा सकते हैं (सही url) कर्ल डॉक

उस पेज से:

curl_setopt($request, CURLOPT_TIMEOUT, 300); //set timeout to 5 mins

curl_setopt($request, CURLOPT_RETURNTRANSFER, true); // true to get the output as string otherwise false

यू भी कर्ल के साथ फ़ाइल डाउनलोड के बारे में ब्लॉग उदाहरण के माध्यम से जा सकते हैं समझ कर्ल मूल बातें
प्रशांत पांडे

2

आप इस फ़ंक्शन का उपयोग कर सकते हैं, जो फाइलसिस्टम में एक गतिरोध पैदा करता है और अगर सब कुछ ठीक रहा तो डाउनलोड की गई फ़ाइल का पथ देता है:

function getFileContents($url)
{
    // Workaround: Save temp file
    $img = tempnam(sys_get_temp_dir(), 'pdf-');
    $img .= '.' . pathinfo($url, PATHINFO_EXTENSION);

    $fp = fopen($img, 'w+');

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    $result = curl_exec($ch);
    curl_close($ch);

    fclose($fp);

    return $result ? $img : false;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.