Как узнать размер файла по его URL на PHP?
30 окт1 комм
На вашем сайте организовано хранение различного рода файлов. Одним из правильных решений будет отображение размера того или иного файла, ведь в зависимости от скорости интернета и его трафика пользователь сделает выводы – может ли он скачать этот файл сейчас или нет.
Реализация следующая:
<?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);
?>
В таком случае, в зависимости от размера файла, мы получим читабельное число и размерность, что значительно удобнее, нежели размер в байтах.