Skip to content
← Back to Snippets
Code

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'];