如何转换 PHP 的 filesize()函数的输出到一个很好的格式与兆字节,千字节等?
filesize()
例如:
下面是一个例子:
<?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; } ?>
更干净的方法:
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; }
一个完整的例子。
<?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]; } ?>
更棒的是我用 插件创建的这个版本,我发现:
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]; }
来自 Filesize ()文件的注释
因为 PHP 的整数类型是有符号的,而且许多平台使用32位 整数时,某些文件系统函数可能返回 大于2GB 的文件
我觉得这是个更好的方法,简单直接。
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] ); }
这是基于@adnan 的伟大答案。
变化:
您仍然可以将 filesize ()调用从函数中提取出来,以获得纯字节格式化函数。但这个可以用在文件上。
/** * 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'; } }
这将是一个更清晰的实施方案:
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; }
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; }
//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]; } }
这个问题的所有答案都使用1 KB = 1024字节,即 错! (< em > 1 kibibyte = 1024字节 )
因为问题要求转换文件大小,所以应该使用 1 KB = 1000字节(参见 https://wiki.ubuntu.com/UnitsPolicy)
function format_bytes($bytes, $precision = 2) { $units = array('B', 'KB', 'MB', 'GB'); $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1000)); $pow = min($pow, count($units) - 1); $bytes /= pow(1000, $pow); return round($bytes, $precision) . ' ' . $units[$pow]; }