Limitare rezoluție imaginii la încărcare

17 ian. 2014, 23:29:13
Vizualizări: 18.1K
Voturi: 7

Am o problemă în care o imagine de dimensiuni foarte mari face ca serverul meu VPS să repornească din cauza problemelor de memorie. Configurația acestei protecții nu depinde de mine, este un fel de mecanism de siguranță al gazdei.

Am un VPS cu 300M memorie, care cred că este suficient pentru instalația mea WordPress, cel puțin pentru operațiunile zilnice.

Imaginea pe care o încarc nu este deosebit de mare ca dimensiune a fișierului (~380 kb) și este în mare parte neagră cu litere albe. Totuși, rezoluția ei este de 4583 * 4583. Când o încarc prin WordPress, primesc o eroare HTTP în fereastra de încărcare, iar când verific site-ul live, acesta este indisponibil pentru câteva minute.

Mă întrebam dacă este posibil să detectez rezoluția unei imagini și să o împiedic să fie încărcată. Sunt destul de priceput să mă descurc cu un editor de imagini, dar unii dintre autorii mei ar putea să nu fie la fel de experimentați pentru a procesa imaginea înainte de a încărca ceva atât de mare.

Ar fi și mai bine dacă limitarea ar putea fi bazată pe biți-per-pixel ai imaginii, dar nu am nicio idee care este limita serverului meu pentru aceasta, așa că cred că un mesaj de eroare care să spună că imaginea nu poate fi încărcată pentru că este mai mare de, să zicem, 2000 * 2000 este suficient.

0
Toate răspunsurile la întrebare 4
0
13

Problema nu este atât încărcarea în sine, deoarece aceasta presupune o conexiune de rețea între client și server. Nu aceasta consumă memoria serverului.

Când WordPress începe să 'proceseze' imaginile, atunci intervine PHP și începe să redimensioneze și să decupeze imaginile încărcate. Înainte de acest moment trebuie să interveniți și să efectuați câteva verificări înainte de a permite PHP să consume memoria.

Folosind filtrul wp_handle_upload_prefilter, puteți atașa o funcție care efectuează orice verificare doriți asupra imaginii care urmează să fie procesată:

<?php 
/* Utilitare Marc Dingena
 * Verifică rezoluția imaginii înainte de procesare
 */
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 = "Dimensiunile imaginii sunt prea mici. Dimensiunea minimă este {$minimum['width']} pe {$minimum['height']} pixeli. Imaginea încărcată are $image_width pe $image_height pixeli.";
    $too_large = "Dimensiunile imaginii sunt prea mari. Dimensiunea maximă este {$maximum['width']} pe {$maximum['height']} pixeli. Imaginea încărcată are $image_width pe $image_height pixeli.";

    if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
        // adaugă în câmpul 'error' al array-ului $file mesajul 
        $file['error'] = $too_small; 
        return $file;
    }
    elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
        // adaugă în câmpul 'error' al array-ului $file mesajul
        $file['error'] = $too_large; 
        return $file;
    }
    else
        return $file;
}
?>
17 ian. 2014 23:29:13
2

Pentru un plugin, încearcă http://wordpress.org/plugins/imsanity/ și acesta te va ajuta să previți încărcarea de imagini prea mari de către alți utilizatori ai site-ului.

Imsanity redimensionează automat imaginile uriașe încărcate la o dimensiune mai rezonabilă pentru afișare în browser, dar încă suficient de mare pentru utilizarea tipică pe site. Plugin-ul este configurat cu lățime, înălțime și calitate maximă. Când un contributor încarcă o imagine mai mare decât dimensiunea configurată, Imsanity o va redimensiona automat la dimensiunea configurată și va înlocui imaginea originală.

17 ian. 2014 23:54:07
Comentarii

În legătură cu consumul de memorie PHP al WordPress pentru procesarea imaginilor, cum ai spune că se compară acest plugin? Nu ar face acest plugin la fel de mult să se blocheze serverul?

Marc Dingena Marc Dingena
18 ian. 2014 00:04:33

Acest plugin este bun pentru a menține un spațiu total pe disc scăzut datorită încărcărilor de imagini originale foarte mari, dar aceasta nu este întrebarea care a fost pusă. Imsanity nu este o soluție pentru problema încărcării originale care eșuează să fie procesată din cauza dimensiunilor în pixeli atât de mari încât PHP se blochează din cauza lipsei de memorie disponibilă.

squarecandy squarecandy
25 ian. 2017 04:56:26
0

Este posibil ca serverul tău să aibă suficientă memorie pentru a efectua sarcina, dar setarea limită de memorie PHP este prea mică pentru conversia imaginilor foarte mari.

Încearcă să setezi memory_limit în php.ini la o valoare mai mare.

memory_limit=256M

*Notă: Această soluție poate să nu fie potrivită în unele medii de hosting.

25 ian. 2017 05:32:06
0

Pentru un plugin, încercați https://es.wordpress.org/plugins/cheetaho-image-optimizer/ și acesta vă va ajuta să preveniți încărcarea de către alți utilizatori a imaginilor prea mari.

8 mai 2024 04:53:54