Get a File's Size
Returns a file size in bytes plus a human-readable label after confirming the file is inside an approved base directory.
Purpose
Returns a file size in bytes plus a human-readable label after confirming the file is inside an approved base directory.
Snippet details
ContextFile SystemLevelPracticalCopy-and-paste statusMarked safe after review.Categories
- Forms and Validation
Code
<?php
/*
* Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
* Free for personal and internal use. Paid project use requires visible credit
* to Jeffery L. Paris. Corporate use requires a paid license fee unless a
* separate written license states otherwise.
*/
/**
* Formats a byte count for display.
*
* @param int $bytes File size in bytes.
* @return string Human-readable file size.
*/
function ogSnippetFormatFileSizeBytes(int $bytes): string {
$units = array('B', 'KB', 'MB', 'GB');
$size = (float) $bytes;
$unit_index = 0;
while ($size >= 1024 && $unit_index < 3) {
$size = $size / 1024;
$unit_index++;
}
return number_format($size, 2).' '.$units[$unit_index];
}
/**
* Get a File's Size.
*
* Purpose:
* Reads filesize() only for files under an approved directory.
*
* @param string $file_path Candidate file path.
* @param string $base_dir Approved base directory.
* @return array File-size result.
*/
function ogSnippetGetFileSize(string $file_path, string $base_dir): array {
$result = array(
'ok' => false,
'bytes' => 0,
'display' => '',
'message' => 'File size was not read.'
);
$resolved_base = realpath($base_dir);
$resolved_file = realpath($file_path);
if ($resolved_base === false || $resolved_file === false) {
$result['message'] = 'File path could not be resolved.';
return $result;
}
if (strpos($resolved_file, $resolved_base) !== 0) {
$result['message'] = 'File is outside the approved directory.';
return $result;
}
if (is_file($resolved_file) === false || is_readable($resolved_file) === false) {
$result['message'] = 'File is not readable.';
return $result;
}
$bytes = filesize($resolved_file);
if ($bytes === false) {
return $result;
}
$result['ok'] = true;
$result['bytes'] = $bytes;
$result['display'] = ogSnippetFormatFileSizeBytes($bytes);
$result['message'] = 'File size was read.';
return $result;
}
$size_report = ogSnippetGetFileSize(__FILE__, __DIR__);
echo 'File size: '.$size_report['display'];