URL থেকে সার্ভারে ফাইল ডাউনলোড করুন


341

ঠিক আছে, এটি বেশ সহজ বলে মনে হচ্ছে, এবং এটিও। আপনার সার্ভারে একটি ফাইল ডাউনলোড করতে আপনাকে যা করতে হবে তা হ'ল:

file_put_contents("Tmpfile.zip", file_get_contents("http://someurl/file.zip"));

কেবল একটি সমস্যা আছে। আপনার যদি 100mb এর মতো একটি বড় ফাইল থাকে তবে কী হবে। তারপরে, আপনি মেমরি ফুরিয়ে যাবেন, এবং ফাইলটি ডাউনলোড করতে সক্ষম হবেন না।

আমি যা চাই তা ফাইলটি ডাউনলোড করার সাথে সাথে ডিস্কে লেখার একটি উপায়। এইভাবে, আমি মেমরির সমস্যায় না পড়ে বড় ফাইলগুলি ডাউনলোড করতে পারি।


4
এটি আপনার সার্ভারের কনফিগারেশনে সেট করা আছে, পিএইচপি সত্যিই আমার কাছাকাছি আসতে পারে না যতটা আমি জানি (সরাসরি .ini সম্পাদনা ব্যতীত)
বেন

উত্তর:


494

যেহেতু পিএইচপি 5.1.0, প্যারামিটার file_put_contents()হিসাবে স্ট্রিম-হ্যান্ডেলটি পেরিয়ে টুকরো টুকরো লেখা সমর্থন করে $data:

file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));

ম্যানুয়াল থেকে:

যদি ডেটা [এটিই দ্বিতীয় যুক্তি] একটি স্ট্রিম রিসোর্স হয়, তবে সেই স্ট্রিমের অবশিষ্ট বাফার নির্দিষ্ট ফাইলটিতে অনুলিপি করা হবে। এটি ব্যবহারের সাথে একই রকম stream_copy_to_stream()

(ধন্যবাদ হাকের ।)


4
এটা আমার প্রথম পছন্দ হবে না। যদি allow_fopen_url Offphp.ini এ সেট করা থাকে (সুরক্ষার জন্য ভাল ধারণা), আপনার স্ক্রিপ্টটি নষ্ট হয়ে যাবে।
দয়া করে

4
@ আইডালমাছিন আমার মনে file_get_contents()হয় যদি এটি হয় তবে (ওপি দেখুন) কাজ করবে না।
অ্যালেক্স

10
@ জিওফ আমি সুনির্দিষ্ট ছিলাম, আপনি যে ফাংশনটি চেয়েছিলেন তা উল্লেখ করেছি। আপনি যা চেয়েছিলেন তা হ'ল কেউ আপনার জন্য কোডটি লিখেছিল - তবে আমি নিশ্চিত যে আপনি নিজেই এটি কিছু শিখেছেন। এছাড়াও, আমরা যদি একে অপরের SO মিথস্ক্রিয়া সম্পর্কে মন্তব্য করতে চলেছি - দয়া করে আরও কিছু উত্তর গ্রহণ করুন :)
আলেক্স

@ অ্যালেক্স: দয়া করে সম্পাদনাটি দেখুন, নিখরচায় অন্তর্ভুক্ত হন। আমি যখন এখানে এই মন্তব্যটি সরাতে পারি তখন আমাকে জানান।
হ্যাক্রে

4
'বি' পতাকাটি বেশিরভাগ ক্ষেত্রেই ব্যবহার করা উচিত fopen; চিত্র এবং অন্যান্য অ সাধারণ টেক্সট ফাইলের বিরূপ প্রভাব প্রতিরোধ করে।
ওয়েইন ওয়েবেল

132
private function downloadFile($url, $path)
{
    $newfname = $path;
    $file = fopen ($url, 'rb');
    if ($file) {
        $newf = fopen ($newfname, 'wb');
        if ($newf) {
            while(!feof($file)) {
                fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
            }
        }
    }
    if ($file) {
        fclose($file);
    }
    if ($newf) {
        fclose($newf);
    }
}

1
আপনার স্নিপিতের জন্য ধন্যবাদ, তবে আপনি কি আপনার কোড @ xaav ব্যাখ্যা করতে সক্ষম হবেন? আমি পিএইচপি তে একেবারে উজ্জ্বল নই। 1024 * 8 এর জন্য কী? আবার ধন্যবাদ.
vvMINOvv

@WMINOw লাইনের দৈর্ঘ্য।
ডেভিড বেলঞ্জার

2
বিশেষত, প্যারামিটার বাইটে থাকায় এর অর্থ একসময় 8KB পর্যন্ত (কেবি * 8 প্রতি 1024 বাইট) পড়তে হবে। লাইনটি যতক্ষণ না <= 8KB হবে, ততক্ষণে এটি সম্পূর্ণ লাইনটি একবারে পড়বে।
ডক্টর জে

1
কেন এটি সেরা উত্তর নয়?
গানজ্যাক

1
এই পদ্ধতির মাধ্যমে আপনি কীভাবে ত্রুটিগুলি পরিচালনা করবেন? যদি 404 ফেরত আসে বা সংযোগটি বাধাগ্রস্ত হয় বা সময় শেষ হয় তবে কী হবে?
অ্যাডাম সুইন্ডেন

67

সিআরএল ব্যবহার করার চেষ্টা করুন

set_time_limit(0); // unlimited max execution time
$options = array(
  CURLOPT_FILE    => '/path/to/download/the/file/to.zip',
  CURLOPT_TIMEOUT =>  28800, // set this to 8 hours so we dont timeout on big files
  CURLOPT_URL     => 'http://remoteserver.com/path/to/big/file.zip',
);

$ch = curl_init();
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);

আমি নিশ্চিত নই তবে CURLOPT_FILEডেটা যেমন টানছে ততই বিকল্পটি এটির সাথে আমি বিশ্বাস করি । বাফার করা হয়নি


2
সাধারণত, এটি ঠিকঠাক হবে তবে আমার কাছে একটি ওয়েব অ্যাপ্লিকেশনটিতে এই কোড রয়েছে, তাই ব্যবহারকারীরা সিআরএল ইনস্টল করবেন কিনা তা আমি নিশ্চিত নই। তবে, আমি এটিকে একটি ভোট দিয়েছি।
xaav

@ জিওফ এটি কি বিতরণ করা ওয়েব অ্যাপ? কারণ আপনি যদি হোস্টিংটি নিয়ন্ত্রণ করেন তবে আপনার ব্যবহারকারীদের সম্পর্কে এটি বিবেচনা করে না (সিআরএল আপনার সার্ভারে একটি গ্রন্থাগার)।
অ্যালেক্স

না। আমি হোস্টিং নিয়ন্ত্রণ করি না। এটি এমন একটি বিতরণযোগ্য ওয়েব অ্যাপ্লিকেশন যা যে কেউ থাকতে পারে।
xaav

3
কার্ল অনুপস্থিত হতে পারে। তবে প্রায় সব ভাগ করা হোস্টিং সংস্থার ডিফল্টরূপে সিআরএল ইনস্টল করা আছে। মানে আমি এমনটি দেখিনি যা এমন হয় না।
মঙ্গিরদাস স্ক্রিপকা

19
আমার পরীক্ষাগুলি হিসাবে, আপনি সরাসরি কোনও ফাইল পাথ CURLOPT_FILE এ নির্ধারণ করতে পারবেন না। এটি একটি ফাইল হ্যান্ডলার হতে হবে। প্রথমে ফাইলটি খুলুন $fh = fopen('/path/to/download/the/file/to.zip', 'w');এবং fclose($fh);তারপরে বন্ধ করুন curl_close($ch);। এবং সেটCURLOPT_FILE => $fh
গুস্তাভো

22

প্রোডিজিটালসনের উত্তর আমার পক্ষে কার্যকর হয়নি। আমি missing fopen in CURLOPT_FILE আরও বিশদ পেয়েছি ।

এটি স্থানীয় ইউআরএল সহ আমার পক্ষে কাজ করেছে:

function downloadUrlToFile($url, $outFileName)
{   
    if(is_file($url)) {
        copy($url, $outFileName); 
    } else {
        $options = array(
          CURLOPT_FILE    => fopen($outFileName, 'w'),
          CURLOPT_TIMEOUT =>  28800, // set this to 8 hours so we dont timeout on big files
          CURLOPT_URL     => $url
        );

        $ch = curl_init();
        curl_setopt_array($ch, $options);
        curl_exec($ch);
        curl_close($ch);
    }
}

19
  1. গন্তব্য সার্ভারে "ডাউনলোড" নামে একটি ফোল্ডার তৈরি করুন
  2. .phpফাইলগুলিতে [এই কোড] সংরক্ষণ করুন এবং গন্তব্য সার্ভারে চালান

ডাউনলোডার:

<html>
<form method="post">
<input name="url" size="50" />
<input name="submit" type="submit" />
</form>
<?php
    // maximum execution time in seconds
    set_time_limit (24 * 60 * 60);

    if (!isset($_POST['submit'])) die();

    // folder to save downloaded files to. must end with slash
    $destination_folder = 'downloads/';

    $url = $_POST['url'];
    $newfname = $destination_folder . basename($url);

    $file = fopen ($url, "rb");
    if ($file) {
      $newf = fopen ($newfname, "wb");

      if ($newf)
      while(!feof($file)) {
        fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
      }
    }

    if ($file) {
      fclose($file);
    }

    if ($newf) {
      fclose($newf);
    }
?>
</html> 

এটি ধরে নিয়েছে যে কোনও বিদ্যমান পিএইচপি অ্যাপ্লিকেশনের মধ্যে কাজ করবে এমন সমাধানের চেয়ে ব্যবহারকারী একটি স্ট্যান্ডলোন স্ক্রিপ্ট চায় এবং আমি বিশ্বাস করি যে ওপি এবং বেশিরভাগ অন্যরা সন্ধান করছেন। ব্যাখ্যাগুলি সেই লোকদের জন্যও সহায়ক হবে যারা এই পদ্ধতির বিষয়টি বুঝতে চান।
বিন বিন

1
যখনই আমি এটি চেষ্টা করি সর্বদা আমার স্থানান্তরিত ফাইলের আকার 50816 তবে আমার ফাইলের আকারটি এর চেয়ে বড় .. 120 এমবি .. কোনও ধারণা কেন এটি?
রিফাজ স্টার

set_time_limit (24 * 60 * 60);একটি লুপ ভিতরে রাখা আছে। স্ক্রিপ্টের শুরুতে এর কোনও প্রভাব নেই।
ভিক্টর জোরাস

16
set_time_limit(0); 
$file = file_get_contents('path of your file');
file_put_contents('file.ext', $file);

আপনার উত্তরটি খুব সহজ এবং ভাল কাজ করা, যেখানে আমাকে সাহায্য করেছিল যেখানে সিআরএল ফাইল পেতে ব্যর্থ হয়েছিল, এটি কাজ করেছিল। ধন্যবাদ :)
টমমিক্স

2
এটি আসলে কী করে তা আপনি ব্যাখ্যা করতে চাইতে পারেন।
অ্যালেক্স

6
এটি পিএইচপি মেমরি সীমা ছাড়িয়ে যাওয়ার ওপির সমস্যার সমাধান করে না।
ব্যবহারকারী 9645

এটি বেশ সহজ এবং সোজা। ফাইলগুলি ছোট বা পরিবেশ একটি স্থানীয় উন্নয়ন যেখানে সরল ক্ষেত্রে এটি বেশ কার্যকর।
ভ্যালেন্টাইন শি

.xlsx ফাইলগুলির জন্য কোনও ধারণা? এটি 0 বাইট মেমরির সাথে খালি ফাইল সঞ্চয় করছে।
ধ্রুব ঠাক্কর


8

পিএইচপি তে একটি সহজ পদ্ধতি ব্যবহার করুন copy()

copy($source_url, $local_path_with_file_name);

দ্রষ্টব্য: গন্তব্য ফাইলটি ইতিমধ্যে উপস্থিত থাকলে এটি ওভাররাইট করা হবে

পিএইচপি অনুলিপি () ফাংশন

দ্রষ্টব্য: গন্তব্য ফোল্ডারের জন্য আপনাকে 777 অনুমতি সেট করতে হবে। আপনি যখন নিজের স্থানীয় মেশিনে ডাউনলোড করছেন তখন এই পদ্ধতিটি ব্যবহার করুন।

বিশেষ দ্রষ্টব্য: ইউনিক্স ভিত্তিক সিস্টেমে মালিক, গোষ্ঠী এবং প্রত্যেককে সম্পূর্ণ পঠন / লেখার / সম্পাদনের অনুমতি সহ একটি অনুমোদিত অনুমতি। 777। সাধারণভাবে আমরা এমন সম্পদগুলিতে এই অনুমতিটি দিয়ে থাকি যা কোনও ওয়েব সার্ভারে সর্বজনীন থেকে গোপন করা দরকার হয় না। উদাহরণ: চিত্র ফোল্ডার।


1
আমি কখনই কোনও ওয়েব সার্ভারে 77 777 সেট করতে পারব না, এবং এমন কোনও ওয়েব ডেডলপ্পারের ক্যাপচার করব যা করার খারাপ ধারণা রয়েছে। প্রতিবার, সর্বত্র। সাবধান ! তুমি এটা করতে পার না ! সুরক্ষা সম্পর্কে চিন্তা করুন। OWASP বিধি অনুসরণ করা যথেষ্ট নয়। সাধারণ বিষয়গুলি সম্পর্কে ভাল চিন্তাভাবনা থাকা।
থিয়েরিবি

@ThierryB। দ্রষ্টব্য: আমি স্থানীয় পথ দিয়েছি। এবং এটি অভ্যন্তরীণ অ্যাপ্লিকেশনগুলিতে ব্যবহার করা যেতে পারে। প্রশ্নোত্তর সম্পর্কিত বিষয়ে ভাল পড়া এবং বোঝা understanding বিভিন্ন পরিস্থিতিতে চিন্তা করুন। এবং এটি গৃহীত হয় না / সেরা উত্তর। প্রতিটি প্রশ্নের এতে বিভিন্ন মতামত রয়েছে .. আপনার বোঝার জন্য উদাহরণ: এমনকি ফিবোনাকির একাধিক অনন্য সমাধান রয়েছে যেখানে কেবল একটিই সেরা। অন্যগুলি বিভিন্ন পরিস্থিতিতে ব্যবহৃত হবে।
প্রদীপ কুমার প্রবহরন

ঠিক আছে, তবে সেরা অভ্যাসগুলি সম্পর্কে চিন্তা করতে এবং সুরক্ষিত জায়গাগুলির ভিতরে সেগুলি বাস্তবায়নে সময় নেওয়া আপনাকে বাস্তবায়িত হওয়া ধারণাগুলির আরও ভাল বোঝাপড়া দেবে। যদি কোনও অনুপ্রবেশকারী আপনার ($) বাড়ির অভ্যন্তরে থাকে, কিছু ফাঁদ ফেলে বা কোনও জিনিস তৈরির পক্ষে সবচেয়ে ভাল উপায় আপনি তাকে কিছুটা মাথা ব্যথা করতে পারেন;)
থিয়েরিবি

5

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

function cURLcheckBasicFunctions()
{
  if( !function_exists("curl_init") &&
      !function_exists("curl_setopt") &&
      !function_exists("curl_exec") &&
      !function_exists("curl_close") ) return false;
  else return true;
}

/*
 * Returns string status information.
 * Can be changed to int or bool return types.
 */
function cURLdownload($url, $file)
{
  if( !cURLcheckBasicFunctions() ) return "UNAVAILABLE: cURL Basic Functions";
  $ch = curl_init();
  if($ch)
  {

    $fp = fopen($file, "w");
    if($fp)
    {
      if( !curl_setopt($ch, CURLOPT_URL, $url) )
      {
        fclose($fp); // to match fopen()
        curl_close($ch); // to match curl_init()
        return "FAIL: curl_setopt(CURLOPT_URL)";
      }
      if ((!ini_get('open_basedir') && !ini_get('safe_mode')) || $redirects < 1) {
        curl_setopt($ch, CURLOPT_USERAGENT, '"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //curl_setopt($ch, CURLOPT_REFERER, 'http://domain.com/');
        if( !curl_setopt($ch, CURLOPT_HEADER, $curlopt_header)) return "FAIL: curl_setopt(CURLOPT_HEADER)";
        if( !curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $redirects > 0)) return "FAIL: curl_setopt(CURLOPT_FOLLOWLOCATION)";
        if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
        if( !curl_setopt($ch, CURLOPT_MAXREDIRS, $redirects) ) return "FAIL: curl_setopt(CURLOPT_MAXREDIRS)";

        return curl_exec($ch);
    } else {
        curl_setopt($ch, CURLOPT_USERAGENT, '"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //curl_setopt($ch, CURLOPT_REFERER, 'http://domain.com/');
        if( !curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false)) return "FAIL: curl_setopt(CURLOPT_FOLLOWLOCATION)";
        if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
        if( !curl_setopt($ch, CURLOPT_HEADER, true)) return "FAIL: curl_setopt(CURLOPT_HEADER)";
        if( !curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)) return "FAIL: curl_setopt(CURLOPT_RETURNTRANSFER)";
        if( !curl_setopt($ch, CURLOPT_FORBID_REUSE, false)) return "FAIL: curl_setopt(CURLOPT_FORBID_REUSE)";
        curl_setopt($ch, CURLOPT_USERAGENT, '"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11');
    }
      // if( !curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true) ) return "FAIL: curl_setopt(CURLOPT_FOLLOWLOCATION)";
      // if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
      // if( !curl_setopt($ch, CURLOPT_HEADER, 0) ) return "FAIL: curl_setopt(CURLOPT_HEADER)";
      if( !curl_exec($ch) ) return "FAIL: curl_exec()";
      curl_close($ch);
      fclose($fp);
      return "SUCCESS: $file [$url]";
    }
    else return "FAIL: fopen()";
  }
  else return "FAIL: curl_init()";
}

4

একটি পিএইচপি 4 এবং 5 সমাধান:

রিডফাইল () বড় আকারের ফাইলগুলি পাঠানোর সময় কোনও মেমরির সমস্যা উপস্থিত করবে না। ফোপেন মোড়কে সক্ষম করা থাকলে এই ফাংশনটির সাথে ফাইলের নাম হিসাবে একটি ইউআরএল ব্যবহার করা যেতে পারে।

http://php.net/manual/en/function.readfile.php


1
এটি প্রশ্নের উত্তর দেয় না, কারণ প্রশ্নটি আউটপুট বাফারে না লিখে ডিস্কে লেখার বিষয়ে।
লরেঞ্জ মেয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.