Вопрос или проблема
Код, который я использую, практически идентичен кодексу. Переменные $u и $m возвращают true. Только переменная $error выдает “specified file failed upload test”. Спасибо за любую помощь.
ФОРМА:
PHP
if ($uploadedfile = $_FILES['amfile']) {$u = "Uploaded file set";} else {$u = "Uploaded file NOT set";}
$upload_overrides = array( 'test_form' => false );
if ($movefile = wp_handle_upload( $uploadedfile, $upload_overrides )) {$m = "Movefile file set";} else {$m = "Movefile file NOT set";} ;
if ( $movefile && !isset( $movefile['error'] ) ) {
$error = "File is valid, and was successfully uploaded.\n";
var_dump( $movefile );
} else {
$error = $movefile['error'];
}
echo $u . "<br>";
echo $m . "<br>";
echo $error . "<br>";
Пожалуйста, добавьте ниже код в файл functions.php вашей темы:
add_filter( 'wp_check_filetype_and_ext', 'file_and_ext_allow_for_user', 10, 4 );
function file_and_ext_allow_for_user( $types, $file, $filename, $mimes )
{
if( false !== strpos( $filename, '.doc' ) ) {
$types['ext'] = 'doc';
$types['type'] = 'application/msword';
} else if( false !== strpos( $filename, '.pdf' ) ) {
$types['ext'] = 'pdf';
$types['type'] = 'application/pdf';
} else if( false !== strpos( $filename, '.docx' ) ) {
$types['ext'] = 'docx';
$types['type'] = 'application/docx';
}
return $types;
}
Код загрузки файла
if ( ! function_exists( 'wp_handle_upload' ) ) {
require_once( ABSPATH . 'wp-admin/includes/file.php' );
}
$uploadedfile = $_FILES['amfile'];
if( $uploadedfile ){
$u = "Uploaded file set";
$upload_overrides = array( 'test_form' => false );
$movefile = wp_handle_upload( $uploadedfile, $upload_overrides );
if ( $movefile && !isset( $movefile['error'] ) ) {
$m = "Movefile file set";
echo "File is valid, and was successfully uploaded.\n";
var_dump( $movefile);
} else {
$m = "Movefile file NOT set";
/**
* Ошибка, сгенерированная _wp_handle_upload()
* @see _wp_handle_upload() в wp-admin/includes/file.php
*/
print_r($movefile);
$error = $movefile['error'];
}
} else {
$u = "Uploaded file NOT set";
}
echo $u . "<br>";
echo $m . "<br>";
echo $error . "<br>";
Ответ или решение
Ошибки при загрузке файлов в WordPress могут происходить по различным причинам, и сообщение об ошибке "specified file failed upload test" может быть связано с несколькими факторами. В вашем случае, вы используете стандартный код для загрузки файлов, который может работать некорректно из-за особенностей конфигурации сервера, настроек WordPress или неверных параметров функции wp_handle_upload
.
Теоретическая часть
В WordPress загрузка файлов осуществляется через функционал, предоставляемый API, таких как wp_handle_upload()
. Эта функция обрабатывает файл, проверяет его на соответствие безопасному типу, и перемещает в каталог загрузок. Важные аспекты, которые могут повлиять на успешность загрузки, включают: ограничения на тип файла, разрешённые MIME-типами, размер загружаемого файла, конфигурации сервера и права доступа к каталогам.
Пример
В вашем коде представлен следующий блок с ключевыми операциями:
if ($uploadedfile = $_FILES['amfile']) {
$u = "Uploaded file set";
} else {
$u = "Uploaded file NOT set";
}
$upload_overrides = array( 'test_form' => false );
if ($movefile = wp_handle_upload($uploadedfile, $upload_overrides)) {
$m = "Movefile file set";
} else {
$m = "Movefile file NOT set";
}
if ($movefile && !isset($movefile['error'])) {
$error = "File is valid, and was successfully uploaded.\n";
var_dump($movefile);
} else {
$error = $movefile['error'];
}
echo $u . "<br>";
echo $m . "<br>";
echo $error . "<br>";
Такая ошибка может возникать, если файл не соответствует ожидаемым критериям проверки безопасности. Например, если тип файла или его расширение не разрешены в WordPress.
Применение
-
Проверка типов файлов и MIME-типы:
Вы упомянули, что в файл
functions.php
добавлен фильтрwp_check_filetype_and_ext
, который позволяет загружать файлы определённых типов.doc
,.pdf
и.docx
. Проверьте, что расширение и тип файла, который вы загружаете, точно указаны в этом фильтре:add_filter('wp_check_filetype_and_ext', 'file_and_ext_allow_for_user', 10, 4); function file_and_ext_allow_for_user($types, $file, $filename, $mimes) { if (false !== strpos($filename, '.doc')) { $types['ext'] = 'doc'; $types['type'] = 'application/msword'; } else if (false !== strpos($filename, '.pdf')) { $types['ext'] = 'pdf'; $types['type'] = 'application/pdf'; } else if (false !== strpos($filename, '.docx')) { $types['ext'] = 'docx'; $types['type'] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; } return $types; }
Обратите внимание на правильность MIME-типа, так как для
.docx
тип должен бытьapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
. -
Права доступа (CHMOD):
Убедитесь, что папка загрузок WordPress (
wp-content/uploads/
) имеет правильные права (обычно755
или775
для папок и644
для файлов). Неверные права доступа могут препятствовать записи файлов в каталог. -
Настройки php.ini:
Проверьте настройки
php.ini
, такие как:upload_max_filesize
: максимально допустимый размер файла для загрузки.post_max_size
: общий размер данных, разрешенных для POST-запроса.max_execution_time
иmax_input_time
: время выполнения скрипта и обработки входных данных соответственно.
Убедитесь, что эти параметры не ограничивают загрузку ваших файлов.
-
Логирование ошибок:
Используйте логирование ошибок для получения более подробной информации о сбоях загрузки. Вы можете активировать отладку в WordPress, добавив в файл
wp-config.php
следующее:define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);
Это позволит вам записывать ошибки в файл
debug.log
, находящийся в папке/wp-content/
. -
Проверка на наличие других плагинов:
Убедитесь, что другие плагины или тема не конфликтабельны с процессом загрузки. Для этого попробуйте отключить все плагины и включить их один за другим, чтобы определить, какой из них вызывает проблему.
-
Системные ограничения:
Проверьте, не установлены ли ограничения на сервере, такие как
mod_security
, или политики безопасности, которые могут предотвращать загрузку определенных типов файлов.
Следуя этим шагам, вы сможете точно определить, почему загрузка файла в WordPress не проходит тест, и соответствующим образом устранить проблему. Если проблема не будет решена, стоит рассмотреть возможность обращения за поддержкой к специалистам, имеющим доступ к серверу и кодовой базе вашего сайта.