Вопрос или проблема
У меня есть плагин, который я создаю, и в системе загрузки файлов у меня есть следующее:
$mimes = array('image/jpeg','image/jpg','image/gif','image/png','application/pdf');
if(in_array($_FILES['attach']['type'], $mimes)){
$error = 0;
}
else {
$error = 1;
}
Затем, наряду с другой проверкой ошибок, у меня есть это, чтобы загружать файлы в пользовательскую папку:
if($error == 0) {
$folder = PLUGIN_DIR . '/uploads/';
if(is_dir($folder)) {
$file = $_FILES["attach"]["tmp_name"];
move_uploaded_file($file, $folder.date('Ymd').'_'.$name);
}
}
Это работает идеально. Я это протестировал, но нормально ли это так делать? Или есть лучший способ?
Заранее спасибо!
У WordPress есть свой способ обработки загрузки файлов, поэтому лучше следовать их примеру. Он выполняет некоторую проверку файлов, но если вы хотите быть строгими с MIME-типами, я бы оставил код, который у вас был изначально,
Вот код, который может заменить ваш второй блок, чтобы фактически загрузить файл (модифицированный с примера в Кодексе по приведенной выше ссылке):
// Загружаем обработчик файлов
if ( ! function_exists( 'wp_handle_upload' ) ) {
require_once( ABSPATH . 'wp-admin/includes/file.php' );
}
// Измените вашу директорию загрузки
function wpse_271103_upload_dir(){
return PLUGIN_DIR . '/uploads/';
}
// Регистрируем наш переопределенный путь.
add_filter( 'upload_dir', 'wpse_271103_upload_dir' );
// Указываем, откуда брать файл
$uploadedfile = $_FILES["attach"]["tmp_name"];
// Выполняем перемещение файла
$movefile = wp_handle_upload( $uploadedfile );
// Возвращаем все в норму.
remove_filter( 'upload_dir', 'wpse_271103_upload_dir' );
// Возвращаем ошибку, если это не удалось
if ( ! $movefile || isset( $movefile['error'] ) ) {
echo $movefile['error'];
}
Ответ или решение
Загрузка файлов в WordPress: Усовершенствование вашего плагина
Работа с загрузкой файлов в WordPress — это важный аспект, который требует внимательного подхода к безопасности и правильному управлению ресурсами. Давайте рассмотрим, как можно улучшить ваше решение, используя функции, предлагаемые самой платформой.
Проблема с текущей реализацией
Ваш код показывает, что вы проверяете MIME-типы загружаемых файлов, что является хорошей практикой. Однако, ручная обработка загрузки файлов может привести к некоторым проблемам, включая несовместимость с будущими версиями WordPress и возможные уязвимости безопасности. WordPress предоставляет встроенные функции для обработки загрузки, которые лучше использовать для управления файлами.
Рекомендации по улучшению кода
Вместо вашего текущего подхода я бы предложил воспользоваться функцией wp_handle_upload
, которая упрощает процесс загрузки и предоставляет ряд дополнительных возможностей для обработки ошибок и управления метаданными. Ниже представлен усовершенствованный код, который вы можете использовать.
// Загрузка обработчика файлов
if ( ! function_exists( 'wp_handle_upload' ) ) {
require_once( ABSPATH . 'wp-admin/includes/file.php' );
}
// Изменение директории загрузки
function wpse_271103_upload_dir() {
return PLUGIN_DIR . '/uploads/';
}
// Регистрация переопределения пути
add_filter( 'upload_dir', 'wpse_271103_upload_dir' );
// Получение временного файла
$uploadedfile = $_FILES["attach"];
// Проверка MIME-типов
$mimes = array('image/jpeg', 'image/jpg', 'image/gif', 'image/png', 'application/pdf');
if (in_array($uploadedfile['type'], $mimes)) {
// Перемещение файла
$movefile = wp_handle_upload($uploadedfile, array('test_form' => false));
// Возврат к стандартным настройкам
remove_filter( 'upload_dir', 'wpse_271103_upload_dir' );
// Обработка ошибок
if ( !$movefile || isset($movefile['error']) ) {
echo 'Ошибка: ' . $movefile['error'];
} else {
echo 'Файл был успешно загружен: ' . $movefile['url'];
}
} else {
echo 'Ошибка: Неверный MIME-тип файла.';
}
Преимущества использования wp_handle_upload
-
Безопасность: Функция автоматически обрабатывает аспекты безопасности, минимизируя риск загрузки вредоносных файлов.
-
Управление метаданными:
wp_handle_upload
возвращает массив с информацией о загруженном файле, включая URL и путь к файлу на сервере. -
Гибкость: Вы можете настроить дополнительное поведение, добавляя свои фильтры и хуки.
-
Соответствие стандартам: Использование встроенных функций WordPress обеспечивает вашу совместимость с будущими обновлениями системы.
Заключение
Следуя вышеизложенным рекомендациям, вы значительно улучшите свою систему загрузки файлов. Это не только сделает ваш плагин более надежным и безопасным, но и облегчит его поддержку в будущем. Работа с WordPress всегда должна идти в ногу с её стандартами для достижения максимальной производительности и согласованности.