Разрешение загрузки WebP изображений

17 дек. 2018 г., 23:38:37
Просмотры: 17.9K
Голосов: 14

Я попробовал оба этих варианта, но всё равно получаю сообщение об ошибке: "Извините, этот тип файла не разрешён по соображениям безопасности."

// добавляем поддержку MIME-типов для WebP
function webp_upload_mimes( $existing_mimes ) {
    // добавляем WebP в список разрешённых MIME-типов
    $existing_mimes['webp'] = 'image/webp';

    // возвращаем массив обратно в функцию с добавленным MIME-типом
    return $existing_mimes;
}

add_filter( 'mime_types', 'webp_upload_mimes' );


function my_custom_upload_mimes($mimes = array()) {

   // добавляем WebP в список разрешённых MIME-типов
    $existing_mimes['webp'] = 'image/webp';

    return $mimes;
}

add_action('upload_mimes', 'my_custom_upload_mimes');

Есть идеи?

0
Все ответы на вопрос 4
5
25

Необходимо использовать фильтр wp_check_filetype_and_ext, чтобы установить MIME-тип и расширение для файлов webp, в дополнение к использованию фильтра upload_mimes для добавления MIME-типа в список разрешенных для загрузки.

/**
 * Устанавливает расширение и MIME-тип для файлов .webp.
 *
 * @param array  $wp_check_filetype_and_ext Массив данных файла, содержащий ключи 'ext', 'type' и
 *                                          'proper_filename'.
 * @param string $file                      Полный путь к файлу.
 * @param string $filename                  Имя файла (может отличаться от $file, так как
 *                                          $file находится во временной директории).
 * @param array  $mimes                     Ключ — расширение файла, значение — MIME-тип.
 */
add_filter( 'wp_check_filetype_and_ext', 'wpse_file_and_ext_webp', 10, 4 );
function wpse_file_and_ext_webp( $types, $file, $filename, $mimes ) {
    if ( false !== strpos( $filename, '.webp' ) ) {
        $types['ext'] = 'webp';
        $types['type'] = 'image/webp';
    }

    return $types;
}

/**
 * Добавляет тип файла webp в список разрешенных MIME-типов
 * 
 * @see https://codex.wordpress.org/Plugin_API/Filter_Reference/upload_mimes
 * 
 * @param array $mimes MIME-типы, где ключ — регулярное выражение для расширения файла,
 *                     соответствующего этим типам. 'swf' и 'exe' удалены из полного списка.
 *                     'htm|html' также удаляются в зависимости от возможностей пользователя.
 *
 * @return array
 */
add_filter( 'upload_mimes', 'wpse_mime_types_webp' );
function wpse_mime_types_webp( $mimes ) {
    $mimes['webp'] = 'image/webp';

  return $mimes;
}

Я проверил этот код на WordPress версии 5.0.1 и смог загружать файлы webp после его добавления.

18 дек. 2018 г. 00:37:30
Комментарии

Да, это сработало :)

Best Dev Tutorials Best Dev Tutorials
18 дек. 2018 г. 00:55:03

Так странно. Функция upload_mimes у меня уже была и работала нормально, а потом в один день, без видимых причин, перестала работать. Я обнаружил это, добавил ваш код (у меня проблема была с .svg), и вуаля — идеально! В любом случае, спасибо.

dgo dgo
14 апр. 2020 г. 14:59:51

К сожалению, у меня не работает. До сих пор получаю сообщение "This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading." Использую WP 5.8.

William Beaumont William Beaumont
8 авг. 2021 г. 20:02:10

@WilliamBeaumont Я думаю, что упомянутая вами проблема отличается от проблемы автора. Этот комментарий (и ветка обсуждения) может помочь решить ошибку, которую вы отметили: https://wordpress.org/support/topic/wordpress-5-8-still-rejects-webp-images/#post-14733877

Dave Romsey Dave Romsey
8 авг. 2021 г. 20:34:04

Отлично работает в WP 6 в 2024 году =)

frizzant frizzant
24 янв. 2024 г. 12:12:23
1

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

define( 'ALLOW_UNFILTERED_UPLOADS', true );

Используйте это в файле wp-config.php на время тестирования. Затем попробуйте загрузить файл снова, и если это не сработает, вероятно, хостинг заблокировал загрузку файлов этого типа. Убедитесь, что вы удалили константу сразу после завершения тестирования.

Дополнительно, вы можете использовать функцию get_allowed_mime_types() для проверки разрешенных MIME-типов загружаемых файлов.

18 дек. 2018 г. 00:16:08
Комментарии

Хотя это работает, это может открыть уязвимости через систему загрузки. Будьте осторожны.

Vincent Poirier Vincent Poirier
4 дек. 2021 г. 20:22:46
0

Мне удалось заставить это работать, создав следующий плагин. (Вам просто нужно добавить этот код в новый файл в директории /wp-content/plugins/, чтобы создать плагин. Убедитесь, что вы активировали плагин после его создания.)

<?php
/**
 * Название плагина: WPSE Разрешить загрузку Webp
 */

function webp_file_and_ext( $mime, $file, $filename, $mimes ) {

    $wp_filetype = wp_check_filetype( $filename, $mimes );
    if ( in_array( $wp_filetype['ext'], [ 'webp' ] ) ) {
        $mime['ext']  = true;
        $mime['type'] = true;
    }

    return $mime;
}
add_filter( 'wp_check_filetype_and_ext', 'webp_file_and_ext', 10, 4 );

function add_webp_mime_type( $mimes ) {
    $mimes['webp'] = 'image/webp';
    return $mimes;
}
add_filter( 'upload_mimes', 'add_webp_mime_type' );
8 окт. 2019 г. 10:07:23
0

Я привел пример того, как это может выглядеть в классе:

<?php

class Example {
    public array $mime_types = [
        'woff'  => 'font/woff|application/font-woff|application/x-font-woff|application/x-woff|application/octet-stream',
        'woff2' => 'font/woff2|application/font-woff2|application/x-font-woff2|application/x-woff2|application/octet-stream',
        'ttf'   => 'font/ttf|application/font-ttf|application/x-font-ttf|application/x-ttf|application/octet-stream',
        'otf'   => 'font/otf|application/font-otf|application/x-font-otf|application/x-otf|application/octet-stream',
        'eot'   => 'application/vnd.ms-fontobject'
    ];

    private function __construct() {
        /** ваши другие actions + filters */

        add_filter( 'upload_mimes', [ $this, 'custom_upload_mimes' ] );
        add_filter( 'wp_check_filetype_and_ext', [ $this, 'file_and_ext_webp' ], 10, 4 );
    }

    /**
     * @param $existing_mimes array
     *
     * @return array
     */
    function custom_upload_mimes( $existing_mimes = [] ): array {
        foreach ( $this->mime_types as $ext => $value ) {
            $existing_mimes[ $ext ] = $value;
        }

        return $existing_mimes;
    }

    /**
     * Устанавливает расширение и MIME-тип для предопределенных файлов.
     *
     * @return mixed
     */
    function file_and_ext_webp( $types, $file, $filename, $mimes ) {

        foreach ( $this->mime_types as $ext => $value ) {
            if ( false !== strpos( $filename, ".$ext" ) ) {
                $types['ext']  = $ext;
                $types['type'] = $value;
            }
        }

        return $types;
    }

}

https://gist.github.com/frizzant/7ad08ad6bfc0dbac08dabeed73e2d964

24 янв. 2024 г. 12:21:11