diff --git a/admin/environment.xml b/admin/environment.xml
index f87521126df..0730156d33a 100644
--- a/admin/environment.xml
+++ b/admin/environment.xml
@@ -2078,6 +2078,11 @@
           <ON_CHECK message="incompleteunicodesupport" />
         </FEEDBACK>
       </CUSTOM_CHECK>
+      <CUSTOM_CHECK file="lib/upgradelib.php" function="check_finfo" level="required">
+        <FEEDBACK>
+          <ON_ERROR message="finforequired" />
+        </FEEDBACK>
+      </CUSTOM_CHECK>
     </CUSTOM_CHECKS>
   </MOODLE>
 </COMPATIBILITY_MATRIX>
diff --git a/lang/en/admin.php b/lang/en/admin.php
index 2df58ebef2a..d17a733192d 100644
--- a/lang/en/admin.php
+++ b/lang/en/admin.php
@@ -623,6 +623,7 @@ It is recommended to install local copy of free GeoLite2 City database from MaxM
 IP address location is displayed on simple map or using Google Maps. Please note that you need to have a Google account and apply for free Google Maps API key to enable interactive maps.';
 $string['iplookupmaxmindnote'] = 'This product includes GeoLite2 data created by MaxMind, available from <a href="http://www.maxmind.com">http://www.maxmind.com</a>.';
 $string['ishttpswarning'] = 'It has been detected that your site is not secured using HTTPS. For increased security and improved integrations with other systems is highly recommended to migrate your site to HTTPS.';
+$string['finforequired'] = 'The finfo PHP extension is now required by Moodle, in order to improve mimetype decoding.';
 $string['keeptagnamecase'] = 'Keep tag name casing';
 $string['lang'] = 'Default language';
 $string['langcache'] = 'Cache language menu';
diff --git a/lib/upgradelib.php b/lib/upgradelib.php
index 2cdd6eb34a4..4acff4c6811 100644
--- a/lib/upgradelib.php
+++ b/lib/upgradelib.php
@@ -2516,3 +2516,20 @@ function check_libcurl_version(environment_results $result) {
 
     return null;
 }
+
+/**
+ * Check if the finfo class is present.
+ *
+ * @param environment_results $result object to update, if relevant.
+ * @return environment_results|null updated results or null.
+ */
+function check_finfo(environment_results $result) {
+    if (!class_exists('finfo')) {
+        $result->setInfo('finfo extension not enabled');
+        $result->setStatus(false);
+
+        return $result;
+    }
+
+    return null;
+}