แปลงขนาดไฟล์เป็น KB, MB, GB ใน PHP และ Laravel

Laravel มี Number::fileSize() แปลงจำนวน byte เป็น KB, MB, GB ให้แล้ว ส่วนโปรเจกต์ PHP ธรรมดาใช้ฟังก์ชันสั้น ๆ ที่ปัดเลขข้ามหน่วยได้ถูกต้อง

เผยแพร่
อัปเดต
— เพิ่ม Number::fileSize() ของ Laravel และแก้ฟังก์ชัน PHP ให้ปัดหน่วยถูกต้อง
เวลาอ่าน
2 นาที
แท็ก
#Laravel#PHP

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

อ่านต่อ

ถูกอ้างถึงใน

ล่าสุด

ดูทั้งหมด →