Limitare la risoluzione delle immagini durante il caricamento

17 gen 2014, 23:29:13
Visualizzazioni: 18.1K
Voti: 7

Sto riscontrando un problema in cui un'immagine particolarmente grande sta causando il riavvio del mio server VPS a causa di problemi di memoria. La configurazione di questo è fuori dal mio controllo, è una sorta di misura di sicurezza dell'host.

Ho un VPS con 300M di memoria, che credo sia sufficiente per la mia installazione WordPress, almeno per le operazioni quotidiane.

L'immagine che sto caricando non è particolarmente grande in termini di dimensione del file (~380 kb) ed è principalmente nera con lettere bianche. Tuttavia, la sua risoluzione è 4583 * 4583. Quando la carico tramite WordPress, ottengo un errore HTTP nella finestra di upload, e quando controllo il sito live, risulta irraggiungibile per un paio di minuti.

Mi chiedevo se fosse possibile rilevare la risoluzione di un'immagine e impedirne il caricamento. Sono abbastanza esperto da poter modificare un po' un'immagine in un programma di elaborazione, ma alcuni dei miei autori potrebbero non essere altrettanto esperti da processare l'immagine prima di caricare qualcosa di così grande.

Sarebbe ancora meglio se la limitazione potesse basarsi sui bit-per-pixel dell'immagine, ma non ho idea di quale sia il limite del mio server per questo, quindi immagino che un messaggio di errore che dice che l'immagine non può essere caricata perché è più grande di, diciamo, 2000 * 2000 sia sufficiente.

0
Tutte le risposte alla domanda 4
0
13

Il problema non è tanto il caricamento in sé, poiché quello riguarda la connessione di rete tra il client e il server. Non è ciò che consuma la memoria del server.

Quando WordPress inizia a "processare" le immagini, è lì che entra in gioco PHP e inizia a ridimensionare e ritagliare le immagini caricate. È prima di questo momento che devi intervenire per eseguire alcuni controlli prima che PHP consumi tutta la tua memoria.

Utilizzando il filtro wp_handle_upload_prefilter, puoi agganciare una funzione che esegue qualsiasi controllo tu voglia sull'immagine che sta per essere processata:

<?php 
/* Marc Dingena Utilities
 * Testa la risoluzione dell'immagine prima del processing
 */
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 = "Le dimensioni dell'immagine sono troppo piccole. La dimensione minima è {$minimum['width']} per {$minimum['height']} pixel. L'immagine caricata è $image_width per $image_height pixel.";
    $too_large = "Le dimensioni dell'immagine sono troppo grandi. La dimensione massima è {$maximum['width']} per {$maximum['height']} pixel. L'immagine caricata è $image_width per $image_height pixel.";

    if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
        // aggiunge nel campo 'error' dell'array $file il messaggio 
        $file['error'] = $too_small; 
        return $file;
    }
    elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
        // aggiunge nel campo 'error' dell'array $file il messaggio
        $file['error'] = $too_large; 
        return $file;
    }
    else
        return $file;
}
?>
17 gen 2014 23:29:13
2

Per un plugin, prova http://wordpress.org/plugins/imsanity/ e ti aiuterà a impedire che altri utenti del sito carichino immagini troppo grandi.

Imsanity ridimensiona automaticamente le immagini eccessivamente grandi a dimensioni più adatte per la visualizzazione nel browser, ma comunque sufficientemente grandi per un uso tipico su un sito web. Il plugin è configurabile con una larghezza massima, un'altezza massima e una qualità. Quando un collaboratore carica un'immagine più grande delle dimensioni configurate, Imsanity la ridimensionerà automaticamente alle dimensioni impostate e sostituirà l'immagine originale.

17 gen 2014 23:54:07
Commenti

In relazione al consumo di memoria PHP di WordPress durante l'elaborazione delle immagini, come diresti che si comporta questo plugin? Questo plugin non farebbe soffocare il server allo stesso modo?

Marc Dingena Marc Dingena
18 gen 2014 00:04:33

Questo plugin è utile per mantenere basso lo spazio totale su disco utilizzato a causa di caricamenti di immagini originali molto grandi, ma questa non è la domanda posta. Imsanity non è una soluzione al problema del caricamento originale che fallisce durante l'elaborazione perché le sue dimensioni in pixel sono così grandi che PHP si blocca per mancanza di memoria disponibile.

squarecandy squarecandy
25 gen 2017 04:56:26
0

È possibile che il tuo server abbia memoria sufficiente per eseguire l'operazione, ma che il limite di memoria PHP sia impostato troppo basso per il lavoro di conversione di immagini molto grandi.

Prova ad aumentare il valore di memory_limit nel file php.ini.

memory_limit=256M

*Nota: Questa potrebbe non essere una soluzione appropriata in alcuni ambienti di hosting.

25 gen 2017 05:32:06
0

Per un plugin, prova https://es.wordpress.org/plugins/cheetaho-image-optimizer/ che ti aiuterà a evitare che altri utenti del sito carichino immagini troppo grandi.

8 mag 2024 04:53:54