ফাইল ডাউনলোড না করে দূরবর্তী ফাইলের আকার


উত্তর:


100

এখানে এ সম্পর্কে কিছু পাওয়া গেছে :

রিমোট ফাইলের আকার পেতে এখানে সর্বোত্তম উপায় (যা আমি খুঁজে পেয়েছি)। নোট করুন যে হেড অনুরোধগুলি অনুরোধটির আসল অংশ পায় না, তারা কেবল শিরোনামগুলি পুনরুদ্ধার করে। সুতরাং 100MB এমন একটি সংস্থায় একটি হেড অনুরোধ করা যখন 1KB হয় এমন একটি সংস্থার জন্য হেড অনুরোধের সমান পরিমাণ সময় নেয়।

<?php
/**
 * Returns the size of a file without downloading it, or -1 if the file
 * size could not be determined.
 *
 * @param $url - The location of the remote file to download. Cannot
 * be null or empty.
 *
 * @return The size of the file referenced by $url, or -1 if the size
 * could not be determined.
 */
function curl_get_file_size( $url ) {
  // Assume failure.
  $result = -1;

  $curl = curl_init( $url );

  // Issue a HEAD request and follow any redirects.
  curl_setopt( $curl, CURLOPT_NOBODY, true );
  curl_setopt( $curl, CURLOPT_HEADER, true );
  curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
  curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
  curl_setopt( $curl, CURLOPT_USERAGENT, get_user_agent_string() );

  $data = curl_exec( $curl );
  curl_close( $curl );

  if( $data ) {
    $content_length = "unknown";
    $status = "unknown";

    if( preg_match( "/^HTTP\/1\.[01] (\d\d\d)/", $data, $matches ) ) {
      $status = (int)$matches[1];
    }

    if( preg_match( "/Content-Length: (\d+)/", $data, $matches ) ) {
      $content_length = (int)$matches[1];
    }

    // http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
    if( $status == 200 || ($status > 300 && $status <= 308) ) {
      $result = $content_length;
    }
  }

  return $result;
}
?>

ব্যবহার:

$file_size = curl_get_file_size( "http://stackoverflow.com/questions/2602612/php-remote-file-size-without-downloading-file" );

4
তবে মনে রাখবেন যে কন্টেন্ট-দৈর্ঘ্য ছাড়া প্রতিক্রিয়া হতে পারে।
ভোলকারক

4
curl_getinfo@ ম্যাকির পরামর্শ মতো ব্যবহার করা কি আরও ভাল হবে না ?
Svish

4
@ সুইভস, হ্যাঁ, কারণ এই পদ্ধতিটি আসলে কাজ করে। এখানে উপস্থাপিত পদ্ধতিটি পুনঃনির্দেশিত ইউআরএলগুলিতে ব্যর্থ হয়, যেহেতু এটি প্রথম সামগ্রী-দৈর্ঘ্য গ্রহণ করে যা চূড়ান্ত সামগ্রী-দৈর্ঘ্য নয় (প্রয়োজনীয়?) । আমার অভিজ্ঞতা.
ববি জ্যাক

12
এটি আমার পক্ষে কাজ করে নি যেমন get_user_agent_string()সংজ্ঞা দেওয়া হয়নি। পুরো লাইনটি সরিয়ে পুরো জিনিসটি কাজ করে।
রাপ্তি

4
সার্ভার যদি
হেডকে

63

এই কোড ব্যবহার করে দেখুন

function retrieve_remote_file_size($url){
     $ch = curl_init($url);

     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     curl_setopt($ch, CURLOPT_HEADER, TRUE);
     curl_setopt($ch, CURLOPT_NOBODY, TRUE);

     $data = curl_exec($ch);
     $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);

     curl_close($ch);
     return $size;
}

এটি যদি আপনার পক্ষে কাজ না করে তবে আপনি যুক্ত করতে চাইতে পারেন curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
মার্শহাউস

4
একটি চিত্রের জন্য আমার জন্য কাজ করে না। আমি CURLOPT_FOLLOWLOCATIONসত্য সেট আছে।
Nate

4
@ আবেনিল এই প্যারামিটারটি যুক্ত করুন। curl_setopt ($ কার্ল, CURLOPT_SSL_VERIFYPEER, মিথ্যা);
দবীদার কুমার

4
@ দাভিন্দর কুমার: আপনাকে অনেক ধন্যবাদ, আপনার কোড যুক্ত করে উপরের কোডটি কাজ করে।
ট্রুং লে এনগুইন নাট

4
আপনার স্বাগতম! @ ট্রাংলিংগুইননাট
কুমার

31

কয়েকবার উল্লিখিত হিসাবে, যাওয়ার উপায় হ'ল প্রতিক্রিয়া শিরোনামের ক্ষেত্র থেকে তথ্য পুনরুদ্ধার করাContent-Length

যাইহোক, আপনি এটি নোট করা উচিত

  • আপনি যে সার্ভারটি অনুসন্ধান করছেন তা প্রয়োজনীয়ভাবে হ্যাড পদ্ধতি প্রয়োগ করে (!)
  • fopenপিএইচপি করার সময় কার্ল লাইব্রেরিটি ব্যবহার করার জন্য বা একইভাবে বা এমনকি কার্ল গ্রন্থাগারটি আহ্বান করার জন্য ম্যানুয়ালি একটি হেড অনুরোধ (যা আবারও সমর্থিত হতে পারে না) তৈরি করার get_headers()দরকার নেই (মনে রাখবেন: KISS )

ব্যবহারের get_headers()অনুসরণ চুম্বন নীতি এবং কাজ করে এমনকি যদি সার্ভার অনুসন্ধান করছি HEAD রিকোয়েস্ট সমর্থন করে না।

সুতরাং, এখানে আমার সংস্করণটি (নকল: মানব-পঠনযোগ্য ফর্ম্যাটেড আকারটি প্রদান করে ;-)):

গিস্ট: https://gist.github.com/eyecatchup/f26300ffd7e50a92bc4d (কার্ল এবং get_headers সংস্করণ)
get_headers () - সংস্করণ:

<?php     
/**
 *  Get the file size of any remote resource (using get_headers()), 
 *  either in bytes or - default - as human-readable formatted string.
 *
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @license MIT <http://eyecatchup.mit-license.org/>
 *  @url     <https://gist.github.com/eyecatchup/f26300ffd7e50a92bc4d>
 *
 *  @param   string   $url          Takes the remote object's URL.
 *  @param   boolean  $formatSize   Whether to return size in bytes or formatted.
 *  @param   boolean  $useHead      Whether to use HEAD requests. If false, uses GET.
 *  @return  string                 Returns human-readable formatted size
 *                                  or size in bytes (default: formatted).
 */
function getRemoteFilesize($url, $formatSize = true, $useHead = true)
{
    if (false !== $useHead) {
        stream_context_set_default(array('http' => array('method' => 'HEAD')));
    }
    $head = array_change_key_case(get_headers($url, 1));
    // content-length of download (in bytes), read from Content-Length: field
    $clen = isset($head['content-length']) ? $head['content-length'] : 0;

    // cannot retrieve file size, return "-1"
    if (!$clen) {
        return -1;
    }

    if (!$formatSize) {
        return $clen; // return size in bytes
    }

    $size = $clen;
    switch ($clen) {
        case $clen < 1024:
            $size = $clen .' B'; break;
        case $clen < 1048576:
            $size = round($clen / 1024, 2) .' KiB'; break;
        case $clen < 1073741824:
            $size = round($clen / 1048576, 2) . ' MiB'; break;
        case $clen < 1099511627776:
            $size = round($clen / 1073741824, 2) . ' GiB'; break;
    }

    return $size; // return formatted size
}

ব্যবহার:

$url = 'http://download.tuxfamily.org/notepadplus/6.6.9/npp.6.6.9.Installer.exe';
echo getRemoteFilesize($url); // echoes "7.51 MiB"

অতিরিক্ত নোট: সামগ্রী-দৈর্ঘ্যের শিরোনাম alচ্ছিক। সুতরাং, একটি সাধারণ সমাধান হিসাবে এটি বুলেট প্রমাণ নয় !



4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সত্য, Content-Lengthএটি alচ্ছিক, তবে এটি ডাউনলোড না করেই ফাইলের আকার পাওয়ার একমাত্র উপায় - এবং get_headersএটি পাওয়ার সেরা উপায় content-length
কোয়ান্টিন স্কাউসেন

4
সচেতন থাকুন যে এই পিএইচপি প্রক্রিয়াটির জন্য পরবর্তী সমস্ত HTTP অনুরোধের অভ্যন্তরে অনুরোধ পদ্ধতির পছন্দটি হেডে বদলে দেবে। ব্যবহার করুন stream_context_createথেকে কল জন্য ব্যবহার করতে একটি পৃথক প্রসঙ্গ তৈরি করতে get_headers(7.1+)।
ম্যাটস লিন্ধ

কেবল যোগ করুন, আপনার URL বা ডকুমেন্ট ফাইলের নামের মধ্যে যদি ফাঁকা স্থান থাকে তবে এটি একটি -১
জেসনফ্লেহার্টি

15

অবশ্যই কেবল একটি শিরোনামের অনুরোধ করুন এবং Content-Lengthশিরোনামটি সন্ধান করুন।


14

পিএইচপি ফাংশন get_headers()আমার জন্য কাজ করে চেক করতে বিষয়বস্তু-দৈর্ঘ্যের হিসাবে

$headers = get_headers('http://example.com/image.jpg', 1);
$filesize = $headers['Content-Length'];

আরও বিশদ জন্য: পিএইচপি ফাংশন get_headers ()


4
আমার জন্য (
এনজিএনএক্স

7

আমি নিশ্চিত নই, তবে আপনি কি এর জন্য get_headers ফাংশনটি ব্যবহার করতে পারবেন না?

$url     = 'http://example.com/dir/file.txt';
$headers = get_headers($url, true);

if ( isset($headers['Content-Length']) ) {
   $size = 'file size:' . $headers['Content-Length'];
}
else {
   $size = 'file size: unknown';
}

echo $size;

এই উদাহরণের সাহায্যে, পিএইচপি প্রক্রিয়াটি শেষ না হওয়া অবধি সংযোগটি উন্মুক্ত রাখতে l url- তে লক্ষ্য সার্ভারের পক্ষে সম্ভব হয়েছে (খুব ধীরে ধীরে শিরোনাম ফিরিয়ে দিয়ে, সংযোগটি বাসি হতে দিতে ধীরে ধীরে যথেষ্ট নয়)। যেহেতু মোট পিএইচপি প্রক্রিয়াগুলি এফপিএম দ্বারা সীমাবদ্ধ হতে পারে, একাধিক "ব্যবহারকারী" একসাথে আপনার get_headers স্ক্রিপ্ট অ্যাক্সেস করার সময় এটি এক ধরণের ধীর লরি আক্রমণ করতে পারে।
টেড ফিলিপস

6

এক লাইন সেরা সমাধান:

echo array_change_key_case(get_headers("http://.../file.txt",1))['content-length'];

পিএইচপি খুব সুস্বাদু

function urlsize($url):int{
   return array_change_key_case(get_headers($url,1))['content-length'];
}

echo urlsize("http://.../file.txt");

3

সবচেয়ে সহজ এবং সবচেয়ে কার্যকর বাস্তবায়ন:

function remote_filesize($url, $fallback_to_download = false)
{
    static $regex = '/^Content-Length: *+\K\d++$/im';
    if (!$fp = @fopen($url, 'rb')) {
        return false;
    }
    if (isset($http_response_header) && preg_match($regex, implode("\n", $http_response_header), $matches)) {
        return (int)$matches[0];
    }
    if (!$fallback_to_download) {
        return false;
    }
    return strlen(stream_get_contents($fp));
}

ওপি সূচিত করে "ফাইলটি ডাউনলোড না করেই।" এই পদ্ধতিটি দূরবর্তী সার্ভারের (যেমন: ডাউনলোড করা) মেমরিটিতে ফাইলটি লোড করে। এমনকি সার্ভারগুলির মধ্যে দ্রুত সংযোগ সহ, এটি সহজেই সময় শেষ হতে পারে বা বড় ফাইলগুলিতে খুব দীর্ঘ সময় নিতে পারে। দ্রষ্টব্য: আপনি কখনও বন্ধ করেননি $ fp যা বিশ্বব্যাপী সুযোগে নেই
মাভেলো

4
এই ফাংশনটি যতক্ষণ সম্ভব দেহটি ডাউনলোড করে না; যদি এটিতে Content-Lengthশিরোলেখ থাকে। এবং সুস্পষ্ট $fpসমাপ্তি জরুরি নয়; এটি স্বয়ংক্রিয়ভাবে মেয়াদ শেষ হলে প্রকাশিত হয় released php.net/manual/en/language.types.resource.php
এমপিইউ

nc -l localhost 8080
উপরেরটি

প্রকৃতপক্ষে *closeআধুনিক পিএইচপি-তে বেশিরভাগ ফাংশন প্রয়োজন হয় না। এগুলি দুটি historicalতিহাসিক কারণ থেকে: বাস্তবায়নের সীমাবদ্ধতা এবং সি ভাষার নকল করা।
এমপিইউউ

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

2

যেহেতু এই প্রশ্নটি ইতিমধ্যে "পিএইচপি" এবং "কার্ল" ট্যাগ করেছে, আমি ধরে নিচ্ছি যে পিএইচপি-তে কীভাবে কার্ল ব্যবহার করতে হয় তা আপনি জানেন।

যদি আপনি সেট করেন curl_setopt(CURLOPT_NOBODY, TRUE)তবে আপনি একটি প্রধান অনুরোধ করবেন এবং সম্ভবত প্রতিক্রিয়াটির "সামগ্রী-দৈর্ঘ্য" শিরোনামটি পরীক্ষা করতে পারেন, যা কেবল শিরোনাম হবে।


2

রিমোট ফাইলের আকার পেতে নীচের ফাংশনটি ব্যবহার করে দেখুন

function remote_file_size($url){
    $head = "";
    $url_p = parse_url($url);

    $host = $url_p["host"];
    if(!preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$host)){

        $ip=gethostbyname($host);
        if(!preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$ip)){

            return -1;
        }
    }
    if(isset($url_p["port"]))
    $port = intval($url_p["port"]);
    else
    $port    =    80;

    if(!$port) $port=80;
    $path = $url_p["path"];

    $fp = fsockopen($host, $port, $errno, $errstr, 20);
    if(!$fp) {
        return false;
        } else {
        fputs($fp, "HEAD "  . $url  . " HTTP/1.1\r\n");
        fputs($fp, "HOST: " . $host . "\r\n");
        fputs($fp, "User-Agent: http://www.example.com/my_application\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        $headers = "";
        while (!feof($fp)) {
            $headers .= fgets ($fp, 128);
            }
        }
    fclose ($fp);

    $return = -2;
    $arr_headers = explode("\n", $headers);
    foreach($arr_headers as $header) {

        $s1 = "HTTP/1.1";
        $s2 = "Content-Length: ";
        $s3 = "Location: ";

        if(substr(strtolower ($header), 0, strlen($s1)) == strtolower($s1)) $status = substr($header, strlen($s1));
        if(substr(strtolower ($header), 0, strlen($s2)) == strtolower($s2)) $size   = substr($header, strlen($s2));
        if(substr(strtolower ($header), 0, strlen($s3)) == strtolower($s3)) $newurl = substr($header, strlen($s3));  
    }

    if(intval($size) > 0) {
        $return=intval($size);
    } else {
        $return=$status;
    }

    if (intval($status)==302 && strlen($newurl) > 0) {

        $return = remote_file_size($newurl);
    }
    return $return;
}

উবুন্টু লিনাক্স অ্যাপাচি সার্ভারে এটিই আমার পক্ষে কাজ করেছে। ফাংশনের শুরুতে আমাকে ডিগ্রি $ আকার এবং $ স্থিতি করতে হয়েছিল, অন্যথায় যেমনটি কাজ করেছিল।
গ্যাভিন সিম্পসন

2

এখানে অন্য পদ্ধতির জন্য HEADঅনুরোধগুলি সমর্থন করে না এমন সার্ভারগুলির সাথে কাজ করবে ।

এটি এইচটিটিপি রেঞ্জের শিরোনামযুক্ত ফাইলটির প্রথম বাইটের জন্য অনুরোধ করে সামগ্রীটির জন্য অনুরোধ করতে সিআরএল ব্যবহার করে।

যদি সার্ভার পরিসীমা অনুরোধগুলি সমর্থন করে (বেশিরভাগ মিডিয়া সার্ভারগুলি করবে) তবে এটি সংস্থানটির আকারের সাথে প্রতিক্রিয়া জানাবে।

সার্ভারটি যদি বাইট পরিসরে সাড়া না দেয় তবে দৈর্ঘ্য নির্ধারণের জন্য এটি কোনও সামগ্রী-দৈর্ঘ্যের শিরোনামের সন্ধান করবে।

যদি আকারটি কোনও ব্যাপ্তি বা সামগ্রী-দৈর্ঘ্যের শিরোনামে পাওয়া যায়, তবে স্থানান্তরটি বাতিল হয়ে যায়। যদি আকারটি খুঁজে পাওয়া যায় না এবং ফাংশনটি প্রতিক্রিয়া বডি পড়তে শুরু করে তবে স্থানান্তর বাতিল হয়ে যায়।

এটি একটি পরিপূরক পদ্ধতির হতে পারে যদি কোনও পদ্ধতির কোনও HEADঅনুরোধের ফলাফল 405সমর্থিত না হয়।

/**
 * Try to determine the size of a remote file by making an HTTP request for
 * a byte range, or look for the content-length header in the response.
 * The function aborts the transfer as soon as the size is found, or if no
 * length headers are returned, it aborts the transfer.
 *
 * @return int|null null if size could not be determined, or length of content
 */
function getRemoteFileSize($url)
{
    $ch = curl_init($url);

    $headers = array(
        'Range: bytes=0-1',
        'Connection: close',
    );

    $in_headers = true;
    $size       = null;

    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2450.0 Iron/46.0.2450.0');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_VERBOSE, 0); // set to 1 to debug
    curl_setopt($ch, CURLOPT_STDERR, fopen('php://output', 'r'));

    curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $line) use (&$in_headers, &$size) {
        $length = strlen($line);

        if (trim($line) == '') {
            $in_headers = false;
        }

        list($header, $content) = explode(':', $line, 2);
        $header = strtolower(trim($header));

        if ($header == 'content-range') {
            // found a content-range header
            list($rng, $s) = explode('/', $content, 2);
            $size = (int)$s;
            return 0; // aborts transfer
        } else if ($header == 'content-length' && 206 != curl_getinfo($curl, CURLINFO_HTTP_CODE)) {
            // found content-length header and this is not a 206 Partial Content response (range response)
            $size = (int)$content;
            return 0;
        } else {
            // continue
            return $length;
        }
    });

    curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) use ($in_headers) {
        if (!$in_headers) {
            // shouldn't be here unless we couldn't determine file size
            // abort transfer
            return 0;
        }

        // write function is also called when reading headers
        return strlen($data);
    });

    $result = curl_exec($ch);
    $info   = curl_getinfo($ch);

    return $size;
}

ব্যবহার:

$size = getRemoteFileSize('http://example.com/video.mp4');
if ($size === null) {
    echo "Could not determine file size from headers.";
} else {
    echo "File size is {$size} bytes.";
}

4
আপনার উত্তর আমাকে সত্যিই সাহায্য করেছে। সর্বদা উত্তর ফেরত দেয়। এমনকি যদি Content-Lengthনা পাওয়া যায়।
ইমান হেজাজি

হাই, দেখার এবং মন্তব্য করার জন্য ধন্যবাদ। আপনি এটি সহায়ক খুঁজে পেয়েছি সত্যিই আমি আনন্দিত!
অঙ্কিত010

1

এখানে বেশিরভাগ উত্তরগুলি হয় সিআরএল ব্যবহার করে বা হেডার পড়ার উপর ভিত্তি করে। তবে কিছু নির্দিষ্ট পরিস্থিতিতে আপনি একটি উপায় সহজ সমাধান ব্যবহার করতে পারেন। filesize()পিএইচপি.এন.টিতে ডক্সের নোটটি বিবেচনা করুন । আপনি সেখানে একটি মন্তব্য পেয়ে যাবেন: " পিএইচপি 5.0.0 হিসাবে, এই ফাংশনটি কিছু ইউআরএল র‍্যাপারগুলির সাথেও ব্যবহার করা যেতে পারে which কোন র‌্যাপারগুলি কার্যকারিতার স্ট্যাট () পরিবারকে সমর্থন করে তা নির্ধারণের জন্য সমর্থিত প্রোটোকল এবং র‍্যাপারগুলি দেখুন "।

সুতরাং, যদি আপনার সার্ভার এবং পিএইচপি পার্সার সঠিকভাবে কনফিগার করা থাকে তবে আপনি কেবলমাত্র filesize()ফাংশনটি ব্যবহার করতে পারেন , এটি পুরো URL দিয়ে খাওয়ানো যেতে পারে, কোনও রিমোট ফাইলের দিকে ইঙ্গিত করে, আপনি কোন আকারটি পেতে চান এবং পিএইচপি সমস্ত যাদু করতে দিন।


1

এটি ব্যবহার করে দেখুন: আমি এটি ব্যবহার করেছি এবং ভাল ফলাফল পেয়েছি।

    function getRemoteFilesize($url)
{
    $file_headers = @get_headers($url, 1);
    if($size =getSize($file_headers)){
return $size;
    } elseif($file_headers[0] == "HTTP/1.1 302 Found"){
        if (isset($file_headers["Location"])) {
            $url = $file_headers["Location"][0];
            if (strpos($url, "/_as/") !== false) {
                $url = substr($url, 0, strpos($url, "/_as/"));
            }
            $file_headers = @get_headers($url, 1);
            return getSize($file_headers);
        }
    }
    return false;
}

function getSize($file_headers){

    if (!$file_headers || $file_headers[0] == "HTTP/1.1 404 Not Found" || $file_headers[0] == "HTTP/1.0 404 Not Found") {
        return false;
    } elseif ($file_headers[0] == "HTTP/1.0 200 OK" || $file_headers[0] == "HTTP/1.1 200 OK") {

        $clen=(isset($file_headers['Content-Length']))?$file_headers['Content-Length']:false;
        $size = $clen;
        if($clen) {
            switch ($clen) {
                case $clen < 1024:
                    $size = $clen . ' B';
                    break;
                case $clen < 1048576:
                    $size = round($clen / 1024, 2) . ' KiB';
                    break;
                case $clen < 1073741824:
                    $size = round($clen / 1048576, 2) . ' MiB';
                    break;
                case $clen < 1099511627776:
                    $size = round($clen / 1073741824, 2) . ' GiB';
                    break;
            }
        }
        return $size;

    }
    return false;
}

এখন, এইগুলির মতো পরীক্ষা করুন:

echo getRemoteFilesize('http://mandasoy.com/wp-content/themes/spacious/images/plain.png').PHP_EOL;
echo getRemoteFilesize('http://bookfi.net/dl/201893/e96818').PHP_EOL;
echo getRemoteFilesize('/programming/14679268/downloading-files-as-attachment-filesize-incorrect').PHP_EOL;

ফলাফল:

24.82 কিবি

912 কিবি

101.85 কিবি


1

এইচটিটিপি / ২ অনুরোধটি কভার করতে, এখানে প্রদত্ত ফাংশনটি https://stackoverflow.com/a/2602624/2380767 এখানে কিছুটা পরিবর্তন করা দরকার:

<?php
/**
 * Returns the size of a file without downloading it, or -1 if the file
 * size could not be determined.
 *
 * @param $url - The location of the remote file to download. Cannot
 * be null or empty.
 *
 * @return The size of the file referenced by $url, or -1 if the size
 * could not be determined.
 */
function curl_get_file_size( $url ) {
  // Assume failure.
  $result = -1;

  $curl = curl_init( $url );

  // Issue a HEAD request and follow any redirects.
  curl_setopt( $curl, CURLOPT_NOBODY, true );
  curl_setopt( $curl, CURLOPT_HEADER, true );
  curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
  curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
  curl_setopt( $curl, CURLOPT_USERAGENT, get_user_agent_string() );

  $data = curl_exec( $curl );
  curl_close( $curl );

  if( $data ) {
    $content_length = "unknown";
    $status = "unknown";

    if( preg_match( "/^HTTP\/1\.[01] (\d\d\d)/", $data, $matches ) ) {
      $status = (int)$matches[1];
    } elseif( preg_match( "/^HTTP\/2 (\d\d\d)/", $data, $matches ) ) {
      $status = (int)$matches[1];
    }

    if( preg_match( "/Content-Length: (\d+)/", $data, $matches ) ) {
      $content_length = (int)$matches[1];
    } elseif( preg_match( "/content-length: (\d+)/", $data, $matches ) ) {
        $content_length = (int)$matches[1];
    }

    // http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
    if( $status == 200 || ($status > 300 && $status <= 308) ) {
      $result = $content_length;
    }
  }

  return $result;
}
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.