Справочники, инструменты, документация

PHP: Как узнать размер файла по URL

На вашем сайте организовано хранение различного рода файлов. Одним из правильных решений будет отображение размера того или иного файла, ведь в зависимости от скорости интернета и его трафика пользователь сделает выводы – может ли он скачать этот файл сейчас или нет.
header("Content-Type: text/html; charset=utf-8");
$content = "https://www.google.com/logo.png"; // Ссылка на файл
$file_open = fopen($content, "r");
$file_size = 0;

while(($str = fread($file_open, 1024)) != null) {
    $file_size += strlen($str);
}

echo "Размер файла: ".$file_size;

Все бы хорошо, но в таком случае мы получаем размер в байтах, а что, если мы имеем достаточно большой размер файла и число вида «1 000 000» попросту испугает пользователя? Для этого мы напишем небольшую функцию:

function size_convert($bytes) {
    $bytes = floatval($bytes);

    $arBytes = array(
        0 => array(
            "UNIT" => "Tb",
            "VALUE" => pow(1024, 4)
        ),
        1 => array(
            "UNIT" => "Gb",
            "VALUE" => pow(1024, 3)
        ),
        2 => array(
            "UNIT" => "Mb",
            "VALUE" => pow(1024, 2)
        ),
        3 => array(
            "UNIT" => "Kb",
            "VALUE" => 1024
        ),
        4 => array(
            "UNIT" => "b",
            "VALUE" => 1
        ),
    );

    foreach($arBytes as $arItem) {
        if($bytes >= $arItem["VALUE"]) {

            $result = $bytes / $arItem["VALUE"];
            $result = str_replace(".", "," , strval(round($result, 2)))." ".$arItem["UNIT"];

            break;
        }
    }
    return $result;
}

Внедрим в ранее написанный код. И получим уже следующую конструкцию:

header("Content-Type: text/html; charset=utf-8");

$content = "https://www.google.com/logo.png"; // Ссылка на файл
$file_open = fopen($content, "r");
$file_size = 0;

while(($str = fread($file_open, 1024)) != null) {
    $file_size += strlen($str);
}

function size_convert($bytes) {

$bytes = floatval($bytes);
$arBytes = array(
    0 => array(
        "UNIT" => "Tb",
        "VALUE" => pow(1024, 4)
    ),
    1 => array(
        "UNIT" => "Gb",
        "VALUE" => pow(1024, 3)
    ),
    2 => array(
        "UNIT" => "Mb",
        "VALUE" => pow(1024, 2)
    ),
    3 => array(
        "UNIT" => "Kb",
        "VALUE" => 1024
    ),
    4 => array(
        "UNIT" => "b",
        "VALUE" => 1
    ),
);

    foreach($arBytes as $arItem) {
        if($bytes >= $arItem["VALUE"]) {

            $result = $bytes / $arItem["VALUE"];
            $result = str_replace(".", "," , strval(round($result, 2)))." ".$arItem["UNIT"];

            break;
        }
    }
    return $result;
}
echo "Размер файла: ".size_convert($file_size);

В таком случае, в зависимости от размера файла, мы получим читабельное число и размерность, что значительно удобнее, нежели размер в байтах.