Как узнать размер файла по его URL на PHP?
На вашем сайте организовано хранение различного рода файлов. Одним из правильных решений будет отображение размера того или иного файла, ведь в зависимости от скорости интернета и его трафика пользователь сделает выводы – может ли он скачать этот файл сейчас или нет.
Реализация следующая:
<?php
header("Content-Type: text/html; charset=utf-8");
$content = "https://www.pandoge.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;
}
Которую внедрим в ранее написанный код. И получим уже следующую конструкцию:
<?php
header("Content-Type: text/html; charset=utf-8");
$content = "https://www.pandoge.com/templates/art_malcov/images/blog_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);
?>
В таком случае, в зависимости от размера файла, мы получим читабельное число и размерность, что значительно удобнее, нежели размер в байтах.