Permițând încărcarea fișierelor WebP?

17 dec. 2018, 23:38:37
Vizualizări: 17.9K
Voturi: 14

Am încercat ambele variante, dar tot primesc mesajul de eroare: "Ne pare rău, acest tip de fișier nu este permis din motive de securitate."

// adaugă suport pentru tipurile mime WebP
function webp_upload_mimes( $existing_mimes ) {
    // adaugă WebP în lista de tipuri mime
    $existing_mimes['webp'] = 'image/webp';

    // returnează array-ul înapoi funcției cu tipul nostru mime adăugat
    return $existing_mimes;
}

add_filter( 'mime_types', 'webp_upload_mimes' );


function my_custom_upload_mimes($mimes = array()) {

   // adaugă WebP în lista de tipuri mime
    $existing_mimes['webp'] = 'image/webp';

    return $mimes;
}

add_action('upload_mimes', 'my_custom_upload_mimes');

Alte sugestii?

0
Toate răspunsurile la întrebare 4
5
25

Este necesar să folosiți filtrul wp_check_filetype_and_ext pentru a seta tipul mime și extensia pentru fișierele webp, în plus față de utilizarea filtrului upload_mimes pentru a adăuga tipul mime la lista de tipuri mime ce pot fi încărcate.

/**
 * Setează extensia și tipul mime pentru fișierele .webp.
 *
 * @param array  $wp_check_filetype_and_ext Array de date despre fișier ce conține cheile 'ext', 'type' și
 *                                          'proper_filename'.
 * @param string $file                      Calea completă către fișier.
 * @param string $filename                  Numele fișierului (poate diferi de $file datorită faptului că
 *                                          $file se află într-un director temporar).
 * @param array  $mimes                     Cheia este extensia fișierului cu valoarea ca tip 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;
}

/**
 * Adaugă tipul de fișier webp la tipurile mime permise
 * 
 * @see https://codex.wordpress.org/Plugin_API/Filter_Reference/upload_mimes
 * 
 * @param array $mimes Tipuri mime indexate după regex-ul extensiei fișierului corespunzătoare
 *                     acestor tipuri. 'swf' și 'exe' sunt eliminate din lista completă. 'htm|html' de asemenea
 *                     eliminate în funcție de capacitățile '$user'.
 *
 * @return array
 */
add_filter( 'upload_mimes', 'wpse_mime_types_webp' );
function wpse_mime_types_webp( $mimes ) {
    $mimes['webp'] = 'image/webp';

  return $mimes;
}

Am testat acest cod pe WordPress v5.0.1 și am reușit să încărc fișiere webp după adăugarea acestui cod.

18 dec. 2018 00:37:30
Comentarii

Da, asta a funcționat :)

Best Dev Tutorials Best Dev Tutorials
18 dec. 2018 00:55:03

Ce ciudat. Funcția upload_mimes pe care o aveam deja funcționa perfect, și apoi într-o zi, fără niciun motiv evident, a încetat să mai funcționeze. Am descoperit asta și am adăugat codul tău (pentru mine, problema era .svg), și voilà - perfect! Oricum, mulțumesc pentru asta.

dgo dgo
14 apr. 2020 14:59:51

Nu funcționează pentru mine, din păcate. Încă primesc mesajul "Această imagine nu poate fi procesată de serverul web. Convertiți-o în JPEG sau PNG înainte de încărcare." Folosesc WP 5.8.

William Beaumont William Beaumont
8 aug. 2021 20:02:10

@WilliamBeaumont Cred că problema pe care ai menționat-o este diferită de cea a OP. Acest comentariu (și firul de discuție) ar putea ajuta la rezolvarea erorii pe care ai notat-o: https://wordpress.org/support/topic/wordpress-5-8-still-rejects-webp-images/#post-14733877

Dave Romsey Dave Romsey
8 aug. 2021 20:34:04

Funcționează bine în WP 6 în 2024 =)

frizzant frizzant
24 ian. 2024 12:12:23
1

Uneori încărcările sunt limitate de furnizorul de hosting. Încearcă să definești constanta ALLOW_UNFILTERED_UPLOADS care permite încărcarea oricărui tip de fișier:

define( 'ALLOW_UNFILTERED_UPLOADS', true );

Folosește această constantă în fișierul wp-config.php pentru un moment, în scop de testare. Apoi încearcă să încarci din nou fișierul, iar dacă în continuare nu funcționează, este probabil ca hosting-ul să fi blocat acel tip de fișier pentru încărcare. Asigură-te că elimini constanta cât mai repede posibil, după ce ai terminat testarea.

În plus, poți folosi funcția get_allowed_mime_types() pentru a verifica tipurile de fișiere permise la încărcare.

18 dec. 2018 00:16:08
Comentarii

Deși acest lucru funcționează, poate deschide vulnerabilități prin sistemul de încărcare. Fiți precaut.

Vincent Poirier Vincent Poirier
4 dec. 2021 20:22:46
0

Am reușit să fac să funcționeze prin crearea următorului plugin. (Trebuie doar să adaugi acest cod într-un fișier nou în directorul /wp-content/plugins/ pentru a crea pluginul. Asigură-te că activezi pluginul după ce l-ai creat.)

<?php
/**
 * Plugin Name: WPSE Allow Webp Uploads
 */

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 oct. 2019 10:07:23
0

Am făcut un exemplu despre cum ar putea arăta acest lucru într-o clasă:

<?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() {
        /** alte acțiuni și filtre */

        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;
    }

    /**
     * Setează extensia și tipul mime pentru fișierele predefinite.
     *
     * @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 ian. 2024 12:21:11