Autor Zpráva
maarlin
Profil
Zdravím.
mám fotogalerii v PHP, která využívá GD knihovnu, problém je v tom, že funkce mi nechtějí vytvořit 2 miniatury z jednoho originálu, resp. vytvoří mi to miniaturu pouze pokud má originál urč. rozměry, což absolutně nechápu.
Formulář pro výběr souboru

<form action="akce_add_foto.php" method="post" enctype="multipart/form-data">
Soubor: <input type="file" name="soubor" /><br />
Popis: <input type="text" name="popis" /><br />
<input type="submit" value="Přidat" />
</form>


Zpracovací script

if (empty ($_FILES["soubor"])) {
header ("location: private.php?wt=fotogalerie&stav=3");
exit();
}
// Osetreni vstupu
$_FILES["soubor"]["name"] = eregi_replace ("[[:blank:]]", "-", $_FILES["soubor"]["name"]);
$_FILES["soubor"]["name"] = strtolower ($_FILES["soubor"]["name"]);
$original = array ("á", "č", "ď", "é", "ě", "í", "ó", "ř", "š", "ť", "ú", "ů", "ü", "ý", "ž", "Á", "Č", "Ď", "É", "Ě", "Í", "Ó", "Ř", "Š", "Ť", "Ú", "Ů", "Ý", "Ž");
$nahradit = array ("a", "c", "d", "e", "e", "i", "o", "r", "s", "t", "u", "u", "u", "y", "z", "a", "c", "d", "e", "e", "i", "o", "r", "s", "t", "u", "u", "y", "z");
$_FILES["soubor"]["name"] = str_replace($original, $nahradit, $_FILES["soubor"]["name"]);
$_FILES["soubor"]["name"] = substr ($_FILES["soubor"]["name"], 0, 20);
if (!eregi(".jpg", $_FILES["soubor"]["name"])) {
$_FILES["soubor"]["name"] = $_FILES["soubor"]["name"].".jpg";
}

$dotaz0 = "SELECT * FROM fotky ORDER by id DESC LIMIT 0,1";
$data0 = mysqli_query ($pripojeni, $dotaz0);
$rox = mysqli_fetch_array($data0);
$posledni_id = $rox["id"]+1;

// Zapis do databaze
$dotaz = "INSERT INTO fotky (id, soubor, popis) VALUES ('".$posledni_id."', '0".$posledni_id."_".$_FILES["soubor"]["name"]."', '".$_POST["popis"]."')";
if(mysqli_query ($pripojeni, $dotaz)) {
// Upload originalu
move_uploaded_file($_FILES["soubor"]["tmp_name"], "../fotky/0".$posledni_id."_".$_FILES["soubor"]["name"]);
chmod ("../fotky/0".$posledni_id."_".$_FILES["soubor"]["name"], 0640) or die ("Chyba pri urcovani prav");

// Pripadne zmenseni a nahrani puvodni fotky
list($width, $height) = getimagesize("../fotky/0".$posledni_id."_".$_FILES["soubor"]["name"]);
if ($width >= $height) {
$koef = $width/600;
$n_vyska = ceil ($height/$koef);
$n_sirka = ceil ($width/$koef);
}
if ($height >= $width) {
$koef = $height/600;
$n_sirka = ceil ($width/$koef);
$n_vyska = ceil ($height/$koef);
}
$thumb = imagecreatetruecolor($n_sirka, $n_vyska);
$zdroj = imagecreatefromjpeg("../fotky/0".$posledni_id."_".$_FILES["soubor"]["n ame"]);
imagecopyresampled($thumb, $zdroj, 0, 0, 0, 0, $n_sirka, $n_vyska, $width, $height);
imagejpeg($thumb, "../fotky/_md_0".$posledni_id."_".$_FILES["soubor"]["name"], 100);

// Tvorba miniatury
list($width, $height) = getimagesize("../fotky/0".$posledni_id."_".$_FILES["soubor"]["name"]);
if ($width >= $height) {
$koef = $width/85;
$n_vyska = ceil ($height/$koef);
$n_sirka = ceil ($width/$koef);
}
if ($height >= $width) {
$koef = $height/85;
$n_sirka = ceil ($width/$koef);
$n_vyska = ceil ($height/$koef);
}

$thumb = imagecreatetruecolor($n_sirka, $n_vyska);
$zdroj = imagecreatefromjpeg("../fotky/0".$posledni_id."_".$_FILES["soubor"]["n ame"]);
imagecopyresampled($thumb, $zdroj, 0, 0, 0, 0, $n_sirka, $n_vyska, $width, $height);
imagejpeg($thumb, "../fotky/_th_0".$posledni_id."_".$_FILES["soubor"]["name"], 100);

header ("location: private.php?wt=fotogalerie&stav=1");
} else {
die ("Nastala chyba. #2");
}


Fotku s klasickými rozměry - 1024x786 to v klidu nahraje a vytvoří i obě miniatury, ovšem pokud bych chtěl nahrát fotku s nějakým atypickým rozměrem (např. 1999x848), tak to nahraje jen originál fotky a vytvoří tu první miniaturu (první vzhledem k posloupnosti funkcí ve scriptu). Pokud potřebujete k tomu ještě vědět něco více, stačí se zeptat, díky za jakoukoliv radu.

Prosím zdržte se poznámek ohledně bezpečnosti scriptu, vím že to má nějaké mouchy, ale tenhle script je určen jen pro mého klienta, který přistupuje přes administraci a rozhodně to nehodlá nějak zneužívat.
Alphard
Profil
vypisuje to nějakou chybu?
kód jsem moc nezkoumal, ale není problém s pamětí? 1999x848 je už docela dost
Davex
Profil
Možná pomůže imagedestroy() po uložení náhledu.
maarlin
Profil
Alphard: Právě že to nevypisuje chybu žádnou, jinak bych bych to doložil :)
Ale to mě nenapadlo, s tou pamětí, přesto fotka v těchto rozměrech, má cca 160kB, což imho není tolik. Ale jestli to má i nějakou pamět, která je omezená na samotné rozměry obrázku, to nevím...
tzn. co kdybych nahrával třeba pár kB obrázek takto velký (1999x848px) který by obsahoval třeba jen černou plochu? :)
Davex: Díky za tip, vyzkouším.
Alphard
Profil
EDIT: tady asi byla hloupost, viz koudi :-)
imagedestroy() s tím přímo souvisí, zničení obrazu uvolní pamět
koudi
Profil
samozřejmě nejde o rozměry ale datovou velikost
Imho přesně naopak. Jestli se nepletu, tak gd knihovna si vždycky "rozbalí" v paměti ten obrázek do podoby bitmapy, takže jde čistě o rozměry.

Každopádně kdyby šlo o pamět, tak by php zařvalo fatal error, ne? Takže by to bylo jasný.
Alphard
Profil
Imho přesně naopak. Jestli se nepletu, tak gd knihovna si vždycky "rozbalí" v paměti ten obrázek do podoby bitmapy, takže jde čistě o rozměry.
nevím, byl to můj předpoklad a když o tom přemýším, tak máš asi pravdu :-)
maarlin
Profil
2Alphard, Davex, koudi: Díky za Vaše cenné rady, imagedestroy() pomohlo ;)
Toto téma je uzamčeno. Odpověď nelze zaslat.