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


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.