Autor Zpráva
Vilak
Profil
Zdravím. Mám skript na nahrávání fotek, kteýr mi na localhostu jde a na wedosu ne. Nahrávám fotky, které mají třeba i 8 MB a musím je předělávat na určitou velikost, takže je tam nutné (většinou) jejich zmenšení.

Web mi vypisuje tuto chybu:
Warning: set_time_limit() has been disabled for security reasons in /data/web/virtuals/138112/virtual/www/include/scripts/gallery.php on line 3
string(47) "/data/web/virtuals/138112/virtual/tmp/php9UgwVH" string(26) "Sbh C360 MU16081607590.jpg"
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 37416 bytes) in /data/web/virtuals/138112/virtual/www/include/scripts/gallery.php on line 82

Jen chci dodat, že některé věci jsou ve skriptu zbytečné, protože jsem trošku experimentoval a nevěděl jsem, jak udělat nahrávání fotek a jejich následné zmenšení.

skript:
<?php
     if (isset($_POST['add_photo'])) {
     set_time_limit(1200); // ŘÁDEK 3
         if (!file_exists("../../galerie")) {
             mkdir("../../galerie", 0777);
         }
         if (!file_exists("../../miniatury")) {
             mkdir("../../miniatury", 0777);
         }
         $upload_dir = "../../galerie/";

         $suffix = array("jpg", "jpeg", "png", "gif", "ico", "JPG", "JPEG");
         $message = "";
         include "../prevodni-tabulka.php";
         include "../db/db.php";

         if (isset($_FILES['images']) && is_array($_FILES['images']['name'])) {
             $counter = 0;
             $rank = "";
            $not_uploaded = 0;
            $filenames = [];
            $filenames1 = [];
            $add_message = 1;
            $add_message1 = 1;
            $suffix = array_flip($suffix);
            $url_img = $_SERVER['SERVER_NAME'];


             foreach ($_FILES['images']['name'] as $key => $name) {
                 $filename = basename($name);
                 $tmpname = $_FILES['images']['tmp_name'][$counter];
                 var_dump($tmpname, $filename)."<br>";

                 $stmt = $conn->prepare("SELECT * FROM `images` ORDER BY `id` DESC");
                 $stmt->execute();
                 $result = $stmt->fetch(PDO::FETCH_ASSOC);
                 $lastid = $result['id'];

                 $stmt = $conn->prepare("SELECT * FROM `images`");
                $stmt->execute();
                $rank = $stmt->rowCount();
                $rank = $lastid+100;

                 if ($_FILES['images']['error'] == UPLOAD_ERR_NO_FILE) {
                     $message .= "Nevybrali jste fotky, které chcete nahrát.<br>";
                     header("Location: ../../galerie.php?message=$message");
                 }
                 if (!$_FILES || $_FILES['images']['error'] == UPLOAD_ERR_INI_SIZE) {
                     $not_uploaded++;
                     $sum = $counter + $not_uploaded;
                     if ($sum == sizeof($_FILES['images']['name'])) {
                         $message .= "Soubor je příliš velký, maximální velikost souboru je " . ini_get('upload_max_filesize') . ".<br>";
                     }
                     continue;
                 }
                 if (!is_uploaded_file($tmpname) || !isset($suffix[strtolower(pathinfo($filename, PATHINFO_EXTENSION))])) {
                     $not_uploaded++;
                     $sum = $counter + $not_uploaded;

                     if ($sum == sizeof($_FILES['images']['name'])) {
                         $message .= "Některé soubory obsahují nepovolenou koncovku. Povolené jsou pouze .jpg, .jpeg, .png, .gif a .ico. ";
                     }
                     continue;
                 }
                 $filename = rand(1000, 9999)."-".rand(10, 99)."-".$filename;
                 if (move_uploaded_file($tmpname, "{$upload_dir}".DIRECTORY_SEPARATOR."{$filename}")) {

                     $stmt = $conn->prepare("INSERT INTO `images` (`name`, `alt`, `rank`) VALUES (?, ?, ?)");
                     $stmt->execute(array(
                         $filename,
                         $filename,
                         $rank
                     ));
                     $counter++;

                     ini_set('memory_limit', '-1');
                     // získání rozměrů původního obrázku 
                    $rozmery = getimagesize ("../../galerie/".$filename);  
                    // vypočítá poměr stran původního obrázku 
                    $pomer = $rozmery[0]/$rozmery[1];                     
                    // načtení původního obrázku 
                    $puvodni_obraz = imagecreatefromjpeg("../../galerie/".$filename); // řádek 82
                    // vytvoření nového true color (asi tak 16 milionů barev) obrázku se zadanou šířkou, výška se dopočítá
                    $novy_obraz = imagecreatetruecolor (1024, 1024/$pomer); 
                    // kopírování původního obrázku do nového se zadanou šířkou
                    imagecopyresampled ($novy_obraz, $puvodni_obraz, 0, 0, 0, 0, 1024, 1024/$pomer, $rozmery[0], $rozmery[1]); 
                    // odešle prohlížeči vygenerovaný obrázek. 
                    imagejpeg ($novy_obraz, "../../galerie/".$filename); 
                    // Uvolní systémové prostředky. 
                    imagedestroy ($novy_obraz); 
                    imagedestroy ($puvodni_obraz); 

                 }
             }
             $message .= "Bylo nahráno {$counter} z ".sizeof($_FILES['images']['name'])." obrázků.";
             header("location: ../../galerie.php?message=$message");
         }
     }
?>

Jak to udělat, aby to šlo? Při menších fotkách to funguje, jen nevím, jak pracovat s tak velkýma fotkama.
Taps
Profil
Funkce set_time_limit je z bezoecnostnich duvodu na hostingu zakazana
Vilak
Profil
To jsem z textu celkem pochopil, ale jak vyřešit problém s nahráváním a upravováním velkých fotek? Jde to nějak?
pcmanik
Profil
Vilak:
Skús použiť ImageMagick, ten sa narozdiel od GD nezapočítava do PHP memory limitu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: