# WP_CHECK_FILETYPE_AND_EXT() | WP 3.0.0
Функция wp_check_filetype_and_ext()
предназначена для определения реального типа файла.
Если определить тип файла не удаётся, функция использует расширение имени файла для оценки его типа. Если расширение не соответствует реальному типу файла, функция вернёт корректное имя файла с правильным расширением.
На данный момент эта функция поддерживает переименование только изображений, которые были проверены с помощью функции wp_get_image_mime()
.
## Использует
- wp_check_filetype()
- wp_get_image_mime()
- get_allowed_mime_types()
## Хуки функции
- getimagesize_mimes_to_exts
- wp_check_filetype_and_ext
## Возвращаемое значение
Функция возвращает массив с значениями для расширения, типа MIME и исправленного имени файла.
## Использование
```php
wp_check_filetype_and_ext( $file, $filename, $mimes );
Параметры
- $file (string) (обязательный) — Полный путь к файлу.
- $filename (string) (обязательный) — Имя файла (может отличаться от $file, если файл находится в временном каталоге).
- $mimes (array|null) — Массив допустимых типов MIME с ключами по регулярному выражению для их расширения. По умолчанию использует результат функции
get_allowed_mime_types()
.
Примеры
Пример 1: Проверка типа MIME загруженного изображения
Предположим, мы загружаем изображение с сайта, которому не доверяем. После загрузки необходимо проверить, действительно ли это изображение, а не другой файл с тем же расширением, например, png
, jpg
и т. д.
$file_url = 'http://placekitten.com/200/300';
// Для функции download_url
require_once ABSPATH . 'wp-admin/includes/file.php';
$tmpfile = download_url( $file_url );
$checked = wp_check_filetype_and_ext( $tmpfile, 'kitten.jpg' );
print_r( $checked );
Вывод будет следующим:
Array(
[ext] => jpg
[type] => image/jpeg
[proper_filename] =>
)
Если мы указали имя kitten.png
, то получили бы такой массив:
Array(
[ext] => jpg
[type] => image/jpeg
[proper_filename] => kitten.jpg
)
Если оригинальный файл не прошёл проверку (например, не является изображением или запрещённым для загрузки файлом), то вы получите такой массив:
Array(
[ext] =>
[type] =>
[proper_filename] =>
)
Изменения
- С версии 3.0.0 — введена функция.
Исходный код
function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
$proper_filename = false;
// Основная проверка расширения и сопоставление MIME.
$wp_filetype = wp_check_filetype( $filename, $mimes );
$ext = $wp_filetype['ext'];
$type = $wp_filetype['type'];
// Если файл не существует, ничего не можем сделать.
if ( ! file_exists( $file ) ) {
return compact( 'ext', 'type', 'proper_filename' );
}
$real_mime = false;
// Проверяем тип изображения.
if ( $type && str_starts_with( $type, 'image/' ) ) {
// Пытаемся определить, какой тип изображения на самом деле.
$real_mime = wp_get_image_mime( $file );
$heic_images_extensions = array(
'heif',
'heics',
'heifs',
);
if ( $real_mime && ( $real_mime !== $type || in_array( $ext, $heic_images_extensions, true ) ) ) {
/**
* Фильтрует соответствие MIME-типов изображения их расширениям.
*
* @since 3.0.0
*
* @param array $mime_to_ext Массив MIME-типов изображения и их соответствующих расширений.
*/
$mime_to_ext = apply_filters(
'getimagesize_mimes_to_exts',
array(
'image/jpeg' => 'jpg',
'image/png' => 'png',
'image/gif' => 'gif',
'image/bmp' => 'bmp',
'image/tiff' => 'tif',
'image/webp' => 'webp',
'image/avif' => 'avif',
'image/heic' => 'heic',
'image/heif' => 'heic',
'image/heic-sequence' => 'heic',
'image/heif-sequence' => 'heic',
)
);
// Меняем расширение файла на правильное.
if ( ! empty( $mime_to_ext[ $real_mime ] ) ) {
$filename_parts = explode( '.', $filename );
array_pop( $filename_parts );
$filename_parts[] = $mime_to_ext[ $real_mime ];
$new_filename = implode( '.', $filename_parts );
if ( $new_filename !== $filename ) {
$proper_filename = $new_filename; // Запоминаем изменение.
}
// Обновляем расширение / MIME.
$wp_filetype = wp_check_filetype( $new_filename, $mimes );
$ext = $wp_filetype['ext'];
$type = $wp_filetype['type'];
} else {
// Сбрасываем $real_mime и пробуем заново.
$real_mime = false;
}
}
}
// Проверяем файлы, которые не прошли заявку ранее.
if ( $type && ! $real_mime && extension_loaded( 'fileinfo' ) ) {
$finfo = finfo_open( FILEINFO_MIME_TYPE );
$real_mime = finfo_file( $finfo, $file );
finfo_close( $finfo );
// Дополнительная проверка типов Google документов.
$google_docs_types = array(
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
);
foreach ( $google_docs_types as $google_docs_type ) {
if ( 2 === substr_count( $real_mime, $google_docs_type ) ) {
$real_mime = $google_docs_type;
}
}
// Обработка "неопределённых" типов.
$nonspecific_types = array(
'application/octet-stream',
'application/encrypted',
'application/CDFV2-encrypted',
'application/zip',
);
if ( in_array( $real_mime, $nonspecific_types, true ) ) {
// Допустим, что это файл бинарного типа.
if ( ! in_array( substr( $type, 0, strcspn( $type, '/' ) ), array( 'application', 'video', 'audio' ), true ) ) {
$type = false;
$ext = false;
}
} elseif ( str_starts_with( $real_mime, 'video/' ) || str_starts_with( $real_mime, 'audio/' ) ) {
if ( substr( $real_mime, 0, strcspn( $real_mime, '/' ) ) !== substr( $type, 0, strcspn( $type, '/' ) ) ) {
$type = false;
$ext = false;
}
} elseif ( 'text/plain' === $real_mime ) {
if ( ! in_array(
$type,
array(
'text/plain',
'text/csv',
'application/csv',
'text/richtext',
'text/tsv',
'text/vtt',
),
true
)
) {
$type = false;
$ext = false;
}
} elseif ( 'application/csv' === $real_mime ) {
if ( ! in_array(
$type,
array(
'text/csv',
'text/plain',
'application/csv',
),
true
)
) {
$type = false;
$ext = false;
}
} elseif ( 'text/rtf' === $real_mime ) {
if ( ! in_array(
$type,
array(
'text/rtf',
'text/plain',
'application/rtf',
),
true
)
) {
$type = false;
$ext = false;
}
} else {
if ( $type !== $real_mime ) {
// Если реальный MIME не соответствует расширению, предполагаем, что это небезопасно.
$type = false;
$ext = false;
}
}
}
// Тип MIME должен быть разрешённым.
if ( $type ) {
$allowed = get_allowed_mime_types();
if ( ! in_array( $type, $allowed, true ) ) {
$type = false;
$ext = false;
}
}
/**
* Фильтрует "реальный" тип файла заданного файла.
*
* @since 3.0.0
* @since 5.1.0 Добавлен параметр $real_mime.
*
* @param array $wp_check_filetype_and_ext {
* Значения для расширения, типа MIME и правильного имени файла.
*
* @type string|false $ext Расширение файла или false, если файл не соответствует типу MIME.
* @type string|false $type MIME-тип файла или false, если файл не соответствует типу MIME.
* @type string|false $proper_filename Имя файла с правильным расширением или false, если его нельзя определить.
* }
* @param string $file Полный путь к файлу.
* @param string $filename Имя файла (может отличаться от $file, если файл находится в временном каталоге).
* @param string[]|null $mimes Массив MIME-типов с ключами по шаблону регулярного выражения для их расширения или null, если не было предоставлено.
* @param string|false $real_mime Фактический MIME-тип или false, если тип нельзя определить.
*/
return apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes, $real_mime );
}
Связанные функции
download_url()
media_handle_sideload()
media_handle_upload()
media_sideload_image()
size_format()
wp_check_filetype()
wp_convert_hr_to_bytes()
wp_get_upload_dir()
wp_handle_sideload()
wp_handle_upload()
wp_max_upload_size()
wp_upload_bits()