upload_max_filesize tamaño subido subida peso máximo incrementar getsize ficheros excede directiva aumentar archivos archivo php file filesize

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; }