diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md
index 4ce41d2..3587c36 100644
--- a/framework/CHANGELOG.md
+++ b/framework/CHANGELOG.md
@@ -124,6 +124,7 @@ Yii Framework 2 Change Log
 - Enh #2490: `yii\db\Query::count()` and other query scalar methods now properly handle queries with GROUP BY clause (qiangxue)
 - Enh #2491: Added support for using the same base class name of search model and data model in Gii (qiangxue)
 - Enh #2499: Added ability to downgrade migrations by their absolute apply time (resurtm, gorcer)
+- Enh #2525: Added support for formatting file sizes with `yii\base\Formatter` (VinceG)
 - Enh #2526: Allow for null values in batchInsert (skotos)
 - Enh: Added support for using arrays as option values for console commands (qiangxue)
 - Enh: Added `favicon.ico` and `robots.txt` to default application templates (samdark)
diff --git a/framework/base/Formatter.php b/framework/base/Formatter.php
index 7214cb5..bd280c3 100644
--- a/framework/base/Formatter.php
+++ b/framework/base/Formatter.php
@@ -66,6 +66,16 @@ class Formatter extends Component
 	 * If not set, "," will be used.
 	 */
 	public $thousandSeparator;
+	/**
+	 * @var array the format used to format size (bytes). Three elements may be specified: "base", "decimals" and "decimalSeparator".
+	 * They correspond to the base at which a kilobyte is calculated (1000 or 1024 bytes per kilobyte, defaults to 1024),
+	 * the number of digits after the decimal point (defaults to 2) and the character displayed as the decimal point.
+	 */
+	public $sizeFormat = [
+		'base' => 1024,
+		'decimals' => 2,
+		'decimalSeparator' => null,
+	];
 
 	/**
 	 * Initializes the component.
@@ -404,4 +414,46 @@ class Formatter extends Component
 		$ts = isset($this->thousandSeparator) ? $this->thousandSeparator: ',';
 		return number_format($value, $decimals, $ds, $ts);
 	}
+
+	/**
+	 * Formats the value in bytes as a size in human readable form.
+	 * @param integer $value value in bytes to be formatted
+	 * @param boolean $verbose if full names should be used (e.g. bytes, kilobytes, ...).
+	 * Defaults to false meaning that short names will be used (e.g. B, KB, ...).
+	 * @return string the formatted result
+	 * @see sizeFormat
+	 */
+	public function asSize($value, $verbose = false)
+	{
+		$position = 0;
+
+		do {
+			if ($value < $this->sizeFormat['base']) {
+				break;
+			}
+
+			$value = $value / $this->sizeFormat['base'];
+			$position++;
+		} while ($position < 6);
+
+		$value = round($value, $this->sizeFormat['decimals']);
+		$formattedValue = isset($this->sizeFormat['decimalSeparator']) ? str_replace('.', $this->sizeFormat['decimalSeparator'], $value) : $value;
+		$params = ['n' => $formattedValue];
+		
+		switch($position)
+		{
+			case 0:
+				return $verbose ? Yii::t('yii','{n, plural, =1{# byte} other{# bytes}}', $params) : Yii::t('yii', '{n} B', $params);
+			case 1:
+				return $verbose ? Yii::t('yii','{n, plural, =1{# kilobyte} other{# kilobytes}}', $params) : Yii::t('yii','{n} KB', $params);
+			case 2:
+				return $verbose ? Yii::t('yii','{n, plural, =1{# megabyte} other{# megabytes}}', $params) : Yii::t('yii','{n} MB', $params);
+			case 3:
+				return $verbose ? Yii::t('yii','{n, plural, =1{# gigabyte} other{# gigabytes}}', $params) : Yii::t('yii','{n} GB', $params);
+			case 4:
+				return $verbose ? Yii::t('yii','{n, plural, =1{# terabyte} other{# terabytes}}', $params) : Yii::t('yii','{n} TB', $params);
+			default:
+				return $verbose ? Yii::t('yii','{n, plural, =1{# petabyte} other{# petabytes}}', $params) : Yii::t('yii','{n} PB', $params);
+		}
+	}
 }