কার্ল ব্যবহার করে একটি বড় ফাইল ডাউনলোড করা


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);

তবে এটি বড় ফাইলগুলি হ্যান্ডেল করতে পারে না, কারণ এটি প্রথমে মেমোরিতে পড়ে।

ফাইলটি সরাসরি ডিস্কে প্রবাহিত করা সম্ভব?

উত্তর:


169
<?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);
?>

4
আপনার মন্তব্য @ হ্যাঁ 123 রক্ষা করুন, আমি জানতে আগ্রহী।
জর্জেন পল

8
আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি মনে করি না যে আপনি fwriteব্যবহার করছেন যেহেতু আপনাকে ম্যানুয়ালি ডেটা প্রয়োজন CURLOPT_FILE
শাশা চেদিগোভ

4
@ সাশা চেডিগোভ যেমন উপরে উল্লেখ করেছেন, আপনার fwriteএবং এন্ড ব্যবহার করার দরকার নেই CURLOPT_FILE। পাস $fpকরা যথেষ্ট। আমি উভয়ই করেছি এবং 1ফাইলটির সামগ্রীর শেষে এসেছি ।
কাগজপত্র

@Sasha Chedygov ~ হ্যাঁ আপনি আত প্রয়োজনfwrite
আলিরেজা

4
এটি প্রদর্শিত হয় যে সিআরএলপিএফআরএলটিআরএনএসএফআরএল সেট করার আগে সিআরএলএপিএফএফআইএল সেট করা কাজ করে না, সম্ভবতঃ কারণ সিআরএলএপপিএফআইএল সেট করা হচ্ছে সিআরএলএপপিআরআরসিএনটিআরএনএসএফআর উপর নির্ভর করে। php.net/manual/en/function.curl-setopt.php#99082
নবী KAZ

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...');

4
@ সার্ভাস আপনি fopen()মিথ্যা প্রত্যাবর্তনের সময় এইচটিপি ত্রুটিটি ধরেন এবং সময় শেষ হওয়ার সময় আপনি এটি ফাঁকে রেখে দেন (কল করুন time()এবং গণিতটি করুন)
সিলভিউ-মেরিয়ান

4
সিআরএল এর ইতিমধ্যে এটির কার্যকর বাস্তবায়ন রয়েছে (স্বীকৃত উত্তর দেখুন), আপনি নিজের থেকে কিছু বাস্তবায়ন করতে চান কেন?
পেট্র পেলার

4
কারন সিআরএল পদ্ধতিগত ইন্টারফেসটি বেশ খারাপ
গতিশীল

এটির মূল্য কী, এর জন্য আমি stream_copy_to_streamম্যানুয়ালি সামগ্রীগুলি অনুলিপি করার পরিবর্তে ব্যবহার করছি , একটি সংক্ষিপ্ত কোড তৈরি করে। এটি বা এটির সাথেও কাজ করে না https(যদি আপনি এটিকে নির্ধারণ না করেন $context)। প্রক্রিয়াজাতীয় স্টাইল সম্পর্কিত - ফাইল ফাংশনগুলি খুব ওওপিও নয় এবং যদি আপনি কোনও অ্যারেতে কার্ল বিকল্পগুলি রাখেন তবে এটি যাইহোক উপায় পরিষ্কার দেখায়।
ashein

আমি এটি একটি https দিয়ে পরীক্ষা করেছি, দুর্দান্ত কাজ করেছে !!!, আপনাকে @daynamic সাহায্য করার জন্য ধন্যবাদ।
ওজাল জারবালিয়েভ

6

আপনি যদি নির্দিষ্ট ইউআরএলটির বিষয়বস্তু ডাউনলোড করতে চান তবে নীচে কোডটি সন্ধান করুন এটি কোনও ফাইলে সংরক্ষণ করতে চান।

<?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);
?>

আপনি যদি এফটিপি সার্ভার থেকে ফাইল ডাউনলোড করতে চান তবে আপনি পিএইচপি এফটিপি এক্সটেনশন ব্যবহার করতে পারেন। নীচের কোডটি সন্ধান করুন:

<?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 আপনি যদি পিডিএফ / সিএসভি / চিত্র ইত্যাদি ফাইল পাচ্ছেন তবে সত্য হতে হবে to

আপনি এখানে আরও বিশদটি পেতে পারেন (সঠিক 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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.