subido - Conversión de tamaño de archivo PHP MB/KB
peso archivo php (10)
¿Cómo puedo convertir el resultado de la función filesize()
de PHP a un formato agradable con MegaBytes, KiloBytes, etc.?
me gusta:
- si el tamaño es inferior a 1 MB, muestre el tamaño en KB
- si es entre 1 MB - 1 GB muéstrelo en MB
- si es más grande, en GB
Aún más bonita es esta versión que creé de un complemento que encontré:
function filesize_formatted($path)
{
$size = filesize($path);
$units = array( ''B'', ''KB'', ''MB'', ''GB'', ''TB'', ''PB'', ''EB'', ''ZB'', ''YB'');
$power = $size > 0 ? floor(log($size, 1024)) : 0;
return number_format($size / pow(1024, $power), 2, ''.'', '','') . '' '' . $units[$power];
}
Nota del documento filesize ()
Debido a que el tipo entero de PHP está firmado y muchas plataformas usan enteros de 32 bits, algunas funciones del sistema de archivos pueden devolver resultados inesperados para archivos de más de 2 GB.
Aquí hay una muestra:
<?php
// Snippet from PHP Share: http://www.phpshare.org
function formatSizeUnits($bytes)
{
if ($bytes >= 1073741824)
{
$bytes = number_format($bytes / 1073741824, 2) . '' GB'';
}
elseif ($bytes >= 1048576)
{
$bytes = number_format($bytes / 1048576, 2) . '' MB'';
}
elseif ($bytes >= 1024)
{
$bytes = number_format($bytes / 1024, 2) . '' KB'';
}
elseif ($bytes > 1)
{
$bytes = $bytes . '' bytes'';
}
elseif ($bytes == 1)
{
$bytes = $bytes . '' byte'';
}
else
{
$bytes = ''0 bytes'';
}
return $bytes;
}
?>
Creo que este es un mejor enfoque. Simple y directo.
public function sizeFilter( $bytes )
{
$label = array( ''B'', ''KB'', ''MB'', ''GB'', ''TB'', ''PB'' );
for( $i = 0; $bytes >= 1024 && $i < ( count( $label ) -1 ); $bytes /= 1024, $i++ );
return( round( $bytes, 2 ) . " " . $label[$i] );
}
Esta sería una implementación más limpia:
function size2Byte($size) {
$units = array(''KB'', ''MB'', ''GB'', ''TB'');
$currUnit = '''';
while (count($units) > 0 && $size > 1024) {
$currUnit = array_shift($units);
$size /= 1024;
}
return ($size | 0) . $currUnit;
}
Esto se basa en la gran respuesta de @adnan.
Cambios:
- Se agregó una llamada interna de filesize ()
- devolver el estilo temprano
- guardando una concatenación en 1 byte
Y aún puede sacar la llamada filesize () de la función, para obtener una función de formato de bytes puros. Pero esto funciona en un archivo.
/**
* Formats filesize in human readable way.
*
* @param file $file
* @return string Formatted Filesize, e.g. "113.24 MB".
*/
function filesize_formatted($file)
{
$bytes = filesize($file);
if ($bytes >= 1073741824) {
return number_format($bytes / 1073741824, 2) . '' GB'';
} elseif ($bytes >= 1048576) {
return number_format($bytes / 1048576, 2) . '' MB'';
} elseif ($bytes >= 1024) {
return number_format($bytes / 1024, 2) . '' KB'';
} elseif ($bytes > 1) {
return $bytes . '' bytes'';
} elseif ($bytes == 1) {
return ''1 byte'';
} else {
return ''0 bytes'';
}
}
Un ejemplo completo
<?php
$units = explode('' '',''B KB MB GB TB PB'');
echo("<html><body>");
echo(''file size: '' . format_size(filesize("example.txt")));
echo("</body></html>");
function format_size($size) {
$mod = 1024;
for ($i = 0; $size > $mod; $i++) {
$size /= $mod;
}
$endIndex = strpos($size, ".")+3;
return substr( $size, 0, $endIndex).'' ''.$units[$i];
}
?>
Un enfoque más limpio:
function Size($path)
{
$bytes = sprintf(''%u'', filesize($path));
if ($bytes > 0)
{
$unit = intval(log($bytes, 1024));
$units = array(''B'', ''KB'', ''MB'', ''GB'');
if (array_key_exists($unit, $units) === true)
{
return sprintf(''%d %s'', $bytes / pow(1024, $unit), $units[$unit]);
}
}
return $bytes;
}
//Get the size in bytes
function calculateFileSize($size)
{
$sizes = [''B'', ''KB'', ''MB'', ''GB''];
$count=0;
if ($size < 1024) {
return $size . " " . $sizes[$count];
} else{
while ($size>1024){
$size=round($size/1024,2);
$count++;
}
return $size . " " . $sizes[$count];
}
}
function calcSize($size,$accuracy=2) {
$units = array(''b'',''Kb'',''Mb'',''Gb'');
foreach($units as $n=>$u) {
$div = pow(1024,$n);
if($size > $div) $output = number_format($size/$div,$accuracy).$u;
}
return $output;
}
function getNiceFileSize($file, $digits = 2){
if (is_file($file)) {
$filePath = $file;
if (!realpath($filePath)) {
$filePath = $_SERVER["DOCUMENT_ROOT"] . $filePath;
}
$fileSize = filesize($filePath);
$sizes = array("TB", "GB", "MB", "KB", "B");
$total = count($sizes);
while ($total-- && $fileSize > 1024) {
$fileSize /= 1024;
}
return round($fileSize, $digits) . " " . $sizes[$total];
}
return false;
}