web-dev-qa-db-fra.com

Limiter la résolution de l'image lors du téléchargement

Je rencontre un problème où une image particulièrement volumineuse provoque le redémarrage de mon serveur VPS en raison de problèmes de mémoire. La configuration de ceci est hors de mes mains, c'est un peu comme sécurité intégrée de l'hôte.

J'ai un VPS avec 300 Mo de mémoire, ce qui, à mon avis, est suffisant pour mon installation WordPress, au moins pour les opérations quotidiennes.

L'image que je télécharge n'est pas particulièrement grande en taille de fichier (~ 380 ko) et est principalement noire avec des lettres blanches. Toutefois, sa résolution est de 4583 * 4583. Lorsque je le télécharge via WordPress, une erreur HTTP s’affiche dans la fenêtre de téléchargement. Lorsque je consulte le site en direct, il reste indisponible pendant quelques minutes.

Je me demandais s'il était possible de détecter une résolution d'images et d'empêcher son téléchargement. Je suis assez intelligent pour jouer un peu dans un processeur d'image, mais certains de mes auteurs ne sont peut-être pas assez avertis pour traiter l'image avant de télécharger quelque chose d'aussi gros.

Ce serait encore mieux si la limitation pouvait être basée sur les images, bits par pixel, mais je n'ai aucune idée de la limite de mon serveur, alors je suppose qu'un message d'erreur indiquant que l'image ne peut pas être téléchargée car elle est plus grande que, disons, 2000 * 2000 est suffisant.

5
Marc Dingena

Le problème n’est pas tant le téléchargement lui-même qu’il s’agit d’une connexion réseau entre le client et le serveur. Ce n'est pas ce qui consomme la mémoire du serveur.

Lorsque WordPress commence à "tronquer" les images, c'est là que PHP entre en jeu et commence à redimensionner et à rogner les images téléchargées. C'est avant ce moment que vous devez intervenir et effectuer quelques vérifications avant de permettre à PHP de consommer de la mémoire.

En utilisant le filtre wp_handle_upload_prefilter , vous pouvez associer une fonction qui effectue toutes les vérifications souhaitées sur l’image qui est sur le point d’être masquée:

<?php 
/* Marc Dingena Utilities
 * Test image resolution before image crunch
 */
add_filter('wp_handle_upload_prefilter','mdu_validate_image_size');
function mdu_validate_image_size( $file ) {
    $image = getimagesize($file['tmp_name']);
    $minimum = array(
        'width' => '400',
        'height' => '400'
    );
    $maximum = array(
        'width' => '2000',
        'height' => '2000'
    );
    $image_width = $image[0];
    $image_height = $image[1];

    $too_small = "Image dimensions are too small. Minimum size is {$minimum['width']} by {$minimum['height']} pixels. Uploaded image is $image_width by $image_height pixels.";
    $too_large = "Image dimensions are too large. Maximum size is {$maximum['width']} by {$maximum['height']} pixels. Uploaded image is $image_width by $image_height pixels.";

    if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
        // add in the field 'error' of the $file array the message 
        $file['error'] = $too_small; 
        return $file;
    }
    elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
        //add in the field 'error' of the $file array the message
        $file['error'] = $too_large; 
        return $file;
    }
    else
        return $file;
}
?>
10
Marc Dingena

Pour un plugin, essayez http://wordpress.org/plugins/imsanity/ et cela contribuera à empêcher les autres utilisateurs du site de télécharger des images trop volumineuses.

Imsanity redimensionne automatiquement les envois d'images volumineux à une taille plus raisonnable pour l'affichage dans un navigateur, mais suffisamment grande pour une utilisation classique sur un site Web. Le plugin est configurable avec une largeur, une hauteur et une qualité maximales. Lorsqu'un contributeur télécharge une image d'une taille supérieure à la taille configurée, Imsanity la réduira automatiquement à la taille configurée et remplacera l'image d'origine.

2
markratledge

Il est possible que votre serveur dispose de suffisamment de mémoire pour effectuer cette tâche, mais que le paramètre de limite de mémoire PHP soit trop bas pour convertir des images de très grande taille.

Essayez de régler memory_limit dans php.ini plus haut.

memory_limit=256M

* Remarque: cette solution peut ne pas être appropriée dans certains environnements d'hébergement.

0
squarecandy