web-dev-qa-db-fra.com

Imposer une limite maximale à la taille de téléchargement de la hauteur et de la largeur de l'image

Les clients ont téléchargé d’importantes images, se plaignant ensuite du manque de mémoire du serveur.

Bien sûr, on pourrait accumuler beaucoup de mémoire, mais cela introduit simplement une course aux armements.

Quels crochets puis-je ajouter pour imposer une taille d'image maximale (dimensions, pas la taille du fichier) aux fichiers téléchargés, par exemple. Non, vous ne pouvez pas télécharger cette photo de 8 mégapixels, redimensionnez-la d'abord à <2 mégapixels.

Pour être clair, je parle de la taille de l’image, et non de la taille du fichier, de la hauteur de l’image et de la largeur de l’image

3
Tom J Nowell

En gros, vous récupérez simplement les informations via getimagesize() , une fonction de base PHP, puis gérez vos erreurs avec des notes.

Le plugin

Un plugin de base comme point de départ:

<?php
/** Plugin Name: (#67107) »kaiser« Restrict file upload via image dimensions */

function wpse67107_restrict_upload( $file )
{
    $file_data = getimagesize( $file );
    // Handle cases where we can't get any info:
    if ( ! $file_data )
        return $file;

    list( $width, $height, $type, $hwstring, $mime, $rgb_r_cmyk, $bit ) = $file_data;

    // Add conditions when to abort
    if ( 3200728 < $width * $height )
    {
        // I added 100k as sometimes, there are more rows/columns 
        // than visible pixels, depending on the format
        $file['error'] = 'This image is too large, resize it prior to uploading, ideally below 3.2MP or 2048x1536 px.';
    }

    return $file;
}
add_filter( 'wp_handle_upload_prefilter', 'wpse67107_restrict_upload' );
6
kaiser

Voici mon point de vue

<?php
/**
 * Plugin Name: Deny Giant Image Uploads
 * Description: Prevents Uploads of images greater than 3.2MP
 */

function tomjn_deny_giant_images($file){
    $type = explode('/',$file['type']);

    if($type[0] == 'image'){
        list( $width, $height, $imagetype, $hwstring, $mime, $rgb_r_cmyk, $bit ) = getimagesize( $file['tmp_name'] );
        if($width * $height > 3200728){ // I added 100,000 as sometimes there are more rows/columns than visible pixels depending on the format
            $file['error'] = 'This image is too large, resize it prior to uploading, ideally below 3.2MP or 2048x1536';
        }
    }
    return $file;
}
add_filter('wp_handle_upload_prefilter','tomjn_deny_giant_images');
2
Tom J Nowell

Je comprends que vous devez uniquement refuser les envois basés sur Dimension de l’image . Mais je veux juste ajouter une note, cela n’empêchera pas votre serveur d’obtenir Mémoire insuffisante . Image dimensions est disponible une fois que les données ont été entièrement téléchargées sur le serveur (comme Apache), et la mémoire du serveur est donc utilisée.

Vous devriez envisager de limiter la taille de téléchargement aux niveaux Apache et PHP. Si vous le souhaitez, vous pouvez également limiter le niveau Wordpress pour Dimension d'image. Pour définir la taille maximale de téléchargement dans Apache,

<Directory "/var/www/wordpress-site/wp-uploads">
    LimitRequestBody 10485760
</Directory>

Dans php.ini, définissez:

memory_limit = 64M
upload_max_filesize = 10M
post_max_size = 20M
0
Ravi Kumar