wp_handle_upload указанный файл не прошел тест загрузки

Вопрос или проблема

Код, который я использую, практически идентичен кодексу. Переменные $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.

Применение

  1. Проверка типов файлов и 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.

  2. Права доступа (CHMOD):

    Убедитесь, что папка загрузок WordPress (wp-content/uploads/) имеет правильные права (обычно 755 или 775 для папок и 644 для файлов). Неверные права доступа могут препятствовать записи файлов в каталог.

  3. Настройки php.ini:

    Проверьте настройки php.ini, такие как:

    • upload_max_filesize: максимально допустимый размер файла для загрузки.
    • post_max_size: общий размер данных, разрешенных для POST-запроса.
    • max_execution_time и max_input_time: время выполнения скрипта и обработки входных данных соответственно.

    Убедитесь, что эти параметры не ограничивают загрузку ваших файлов.

  4. Логирование ошибок:

    Используйте логирование ошибок для получения более подробной информации о сбоях загрузки. Вы можете активировать отладку в WordPress, добавив в файл wp-config.php следующее:

    define('WP_DEBUG', true);
    define('WP_DEBUG_LOG', true);
    define('WP_DEBUG_DISPLAY', false);

    Это позволит вам записывать ошибки в файл debug.log, находящийся в папке /wp-content/.

  5. Проверка на наличие других плагинов:

    Убедитесь, что другие плагины или тема не конфликтабельны с процессом загрузки. Для этого попробуйте отключить все плагины и включить их один за другим, чтобы определить, какой из них вызывает проблему.

  6. Системные ограничения:

    Проверьте, не установлены ли ограничения на сервере, такие как mod_security, или политики безопасности, которые могут предотвращать загрузку определенных типов файлов.

Следуя этим шагам, вы сможете точно определить, почему загрузка файла в WordPress не проходит тест, и соответствующим образом устранить проблему. Если проблема не будет решена, стоит рассмотреть возможность обращения за поддержкой к специалистам, имеющим доступ к серверу и кодовой базе вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...