filesize() ของ PHP หรือ Storage::size() ของ Laravel คืนขนาดไฟล์มาเป็นจำนวน byte เช่น 2349000 ซึ่งคนอ่านไม่รู้เรื่อง หน้ารายการไฟล์ควรขึ้นว่า 2.24 MB มากกว่า ถ้าเป็นโปรเจกต์ Laravel มีฟังก์ชันให้ใช้อยู่แล้ว ถ้าเป็น PHP ธรรมดาก็เขียนเองได้ในไม่กี่บรรทัด
Laravel ใช้ Number::fileSize() ได้เลย
Laravel 10 รุ่นหลัง ๆ ขึ้นมามี Number::fileSize() ให้แล้ว
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Number;
Number::fileSize(Storage::size('reports/sales.pdf'), precision: 2);
Number::fileSize(2349000); // 2 MB
Number::fileSize(2349000, precision: 2); // 2.24 MB
Number::fileSize(1536, precision: 2); // 1.50 KB
Number::fileSize(1536, maxPrecision: 2); // 1.5 KB
ค่าเริ่มต้นของ precision คือ 0 ถ้าไม่ส่งอะไรเลย ไฟล์ 2.24 MB จะขึ้นแค่ 2 MB ส่ง precision เมื่ออยากได้ทศนิยมครบทุกหลักอย่าง 1.50 KB หรือส่ง maxPrecision เมื่ออยากตัด 0 ท้ายทิ้งเหลือ 1.5 KB
ใน Blade เรียกผ่าน alias Number ได้เลย ไม่ต้อง import
<td>{{ Number::fileSize($file->size, maxPrecision: 2) }}</td>
PHP ธรรมดาเขียนฟังก์ชันเอง
โปรเจกต์ที่ไม่ได้ใช้ Laravel หรือ server ที่ไม่มี intl ใช้ฟังก์ชันนี้แทน
function formatBytes(int|float $bytes, int $precision = 2): string
{
$units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
$bytes = max($bytes, 0);
$power = 0;
while (round($bytes, $precision) >= 1024 && $power < count($units) - 1) {
$bytes /= 1024;
$power++;
}
return round($bytes, $precision) . ' ' . $units[$power];
}
formatBytes(filesize('reports/sales.pdf'));
formatBytes(2349000); // 2.24 MB
formatBytes(1536); // 1.5 KB
formatBytes(1048575); // 1 MB
formatBytes(2349000, 0); // 2 MB
ฟังก์ชันหารด้วย 1024 ไปเรื่อย ๆ จนตัวเลขที่ปัดแล้วต่ำกว่า 1024 ถึงจะหยุด ไฟล์ขนาด 1,048,575 bytes จึงขึ้นว่า 1 MB ถ้าหาหน่วยด้วย log() ก่อนแล้วค่อยปัดเลข ไฟล์ขนาดนี้จะออกมาเป็น 1024 KB





