PHP文件大小格式化函数合集

php中有一个系统自带的计算文件大小的函数,就是filesize(),但是这个函数是以字节为单位的,在一些情况下,我们需要很直观的了解一个文件大小,就不仅仅需要字节B这个单位了,还需要KB,MB,GB,甚至更大TB,PB,所以我们需要自己写一些函数来格式化filesize()的输出结果。

比如碰到一个很大的文件有49957289167B,大家一看这么一长串的数字后面单位是字节B,还是不知道这个文件的大小是一个什么概念,我们把它转换成GB为单位,就是46.53GB。用下面这些函数就可以完成这个工作:

  1. //转换单位
  2. function setupSize($fileSize) {
  3. $size = sprintf("%u", $fileSize);
  4. if($size == 0) {
  5. return("0 Bytes");
  6. }
  7. $sizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
  8. return round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $sizename[$i];
  9. }
  10. function byte_format($size, $dec=2){
  11. $a = array("B", "KB", "MB", "GB", "TB", "PB");
  12. $pos = 0;
  13. while ($size >= 1024) {
  14. $size /= 1024;
  15. $pos++;
  16. }
  17. return round($size,$dec)." ".$a[$pos];
  18. }
  19. /* Use : echo format_size(filesize("fichier"));
  20. Example result : 13,37 Ko */
  21. function format_size($o) {
  22. $size = array('Go' => 1073741824, 'Mo' => 1048576, 'Ko' => 1024, 'octets' => 1);
  23. foreach ($size as $k => $v)
  24. if ($o >= $v) {
  25. if ($k == 'octets')
  26. return round($o).' '.$k;
  27. return number_format($o / $v, 2, ',', ' ').' '.$k;
  28. }
  29. }
  30. /**
  31. * 文件大小格式化
  32. * @param integer $size 初始文件大小,单位为byte
  33. * @return array 格式化后的文件大小和单位数组,单位为byte、KB、MB、GB、TB
  34. */
  35. function file_size_format($size = 0, $dec = 2) {
  36. $unit = array("B", "KB", "MB", "GB", "TB", "PB");
  37. $pos = 0;
  38. while ($size >= 1024) {
  39. $size /= 1024;
  40. $pos++;
  41. }
  42. $result['size'] = round($size, $dec);
  43. $result['unit'] = $unit[$pos];
  44. return $result['size'].$result['unit'];
  45. }
  46. echo file_size_format(123456789);
  47. /**
  48. * 文件大小单位格式化
  49. * @param $bytes 文件实际大小,单位byte
  50. * @param $prec 转换后精确度,默认精确到小数点后两位
  51. * @return 转换后的大小+单位的字符串
  52. */
  53. function fsizeformat($bytes,$prec=2){
  54. $rank=0;
  55. $size=$bytes;
  56. $unit="B";
  57. while($size>1024){
  58. $size=$size/1024;
  59. $rank++;
  60. }
  61. $size=round($size,$prec);
  62. switch ($rank){
  63. case "1":
  64. $unit="KB";
  65. break;
  66. case "2":
  67. $unit="MB";
  68. break;
  69. case "3":
  70. $unit="GB";
  71. break;
  72. case "4":
  73. $unit="TB";
  74. break;
  75. default :
  76. }
  77. return $size." ".$unit;
  78. }
  79. /**
  80. * 容量格式化
  81. * @param String 文件名(文件路径)
  82. * @return 如果文件存在返回格式化的字符串 如果错误返回错误信息 Unknown File
  83. */
  84. function sizeFormat ($fileName){
  85. //获取文件的大小
  86. @ $filesize=filesize($fileName);
  87. //如果文件不存在返回错误信息
  88. if(false==$filesize){
  89. return 'Unknown File';
  90. }
  91. //格式化文件容量信息
  92. if ($filesize >= 1073741824) $filesize = round($filesize / 1073741824 * 100) / 100 . ' GB';
  93. elseif ($filesize >= 1048576) $filesize = round($filesize / 1048576 * 100) / 100 . ' MB';
  94. elseif ($filesize >= 1024) $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
  95. else $filesize = $filesize . ' Bytes';
  96. return $filesize;
  97. }
  98. //测试函数
  99. echo sizeFormat('config.inc.php');
  100. /**
  101. * 文件大小格式化
  102. * @param type $filesize
  103. */
  104. private function sizeCount($filesize)
  105. {
  106. if ($filesize >= 1073741824) {
  107. $filesize = round($filesize / 1073741824 * 100) / 100 . ' GB';
  108. }
  109. else if ($filesize >= 1048576) {
  110. $filesize = round($filesize / 1048576 * 100) / 100 . ' MB';
  111. }
  112. else if ($filesize >= 1024) {
  113. $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
  114. }
  115. return $filesize;
  116. }
  117. //该函数最主要的是根据文件的字节数,判断应当选择的统计单位,也就是说一个文件用某一单位比如MB,那么该文件肯定小于1GB,否则当然要用GB作为单位了,而且文件要大于KB,不然的话得用更小的单位统计。该函数代码如下
  118. //size() 统计文件大小
  119. function size($byte)
  120. {
  121. if($byte < 1024) {
  122. $unit="B";
  123. }
  124. else if($byte < 10240) {
  125. $byte=round_dp($byte/1024, 2);
  126. $unit="KB";
  127. }
  128. else if($byte < 102400) {
  129. $byte=round_dp($byte/1024, 2);
  130. $unit="KB";
  131. }
  132. else if($byte < 1048576) {
  133. $byte=round_dp($byte/1024, 2);
  134. $unit="KB";
  135. }
  136. else if ($byte < 10485760) {
  137. $byte=round_dp($byte/1048576, 2);
  138. $unit="MB";
  139. }
  140. else if ($byte < 104857600) {
  141. $byte=round_dp($byte/1048576,2);
  142. $unit="MB";
  143. }
  144. else if ($byte < 1073741824) {
  145. $byte=round_dp($byte/1048576, 2);
  146. $unit="MB";
  147. }
  148. else {
  149. $byte=round_dp($byte/1073741824, 2);
  150. $unit="GB";
  151. }
  152. $byte .= $unit;
  153. return $byte;
  154. } //phpfensi.com
  155. //辅助函数 round_up(),该函数用来取舍小数点位数的,四舍五入。
  156. function round_dp($num , $dp)
  157. {
  158. $sh = pow(10 , $dp);
  159. return (round($num*$sh)/$sh);
  160. }

这样我们就能很好额统计任何一个文件的大小了,首先通过系统自带的filesize()函数获得文件的字节数,再用上面的这些函数换算成适当的单位就可以了。