Autor Zpráva
peta
Profil *
Lze zjistit velikost obrazku a rozmery pred upload?
Lze zjistit rozmery obrazku jinak nez pres GD (mam pokusny test na xhostingu a nefunguje mi tam funkce GetImageSize, resp ted presne nevim proc, mozna spatny zapis, takze touhle zavorkou se nezabyvejte)

pro pridavani foto mam script
$tabulka = $tb1."insertion";
$dotaz = "INSERT INTO $tabulka VALUES ('$dotaz')";
mysql_query($dotaz) or die("DB error: add inserat = ".mysql_error());

$dotaz = "SELECT * FROM $tabulka ORDER BY `i1_lastdate` DESC LIMIT 1";
$vysledek = mysql_query($dotaz) or die("DB Error: insertion find! ".mysql_error());
$pocet = mysql_NumRows($vysledek);
if ($pocet===1)
{
$row2 = mysql_fetch_array($vysledek);
$id=$row2['id'];

$MAX_SIZE = 102400;
$FILE_MIMES = array('image/pjpeg','image/jpeg','image/jpg','image/gif','image/png');
$FILE_EXTS = array('.jpeg','.jpg','.png','.gif');

$in2['photo']="";
$photo = array();
$photo = isset($_FILES['i1_photo0'])?$_FILES['i1_photo0']:$HTTP_POST_FILES['i1_ photo0'];
if ($photo['name']!=="" && is_uploaded_file($photo['tmp_name']) && $photo['size']<$MAX_SIZE)
{
$file_ext = strtolower(substr($photo['name'],strrpos($photo['name'],".")));
if (in_array($photo['type'], $FILE_MIMES) && in_array($file_ext, $FILE_EXTS) )
{
$filepath=$pathPhotoI.'/'.$id.$file_ext;
move_uploaded_file($photo['tmp_name'],$filepath); //copy
$in2['photo']=$filepath;
}
else $chyba.= " | Photo - spatny typ nebo pripona";
}
else $chyba.= " | Photo - spatna velikost souboru nebo nazev (nebo typ)";

$dotaz = "UPDATE $tabulka SET `i1_photo0`='".$in2['photo']."' WHERE `id`='$id' LIMIT 1";
mysql_query($dotaz) or die("DB Error: insertion add photo: ".mysql_error());
}
.... a jestli to spravne chapu, obrazek (soubor) se presune do tempu, kde si z nej muzu precist, co chci a pak jej presunu na svou adresku. Mimo to tam je script pro vlozeni inzeratu, nacteni inzeratu, abych ziskal ID, kterym pak pojmenuji foto. Ja bych nejlepe chtel zabranit prenosu souboru, pokud nevyhovuje.

odesilaci pole vypada takto:
<tr> <td><?=$lng['i1_Photo']?>1</td>
<td><input type="file" value="<?=$p[12]?>" name="i1_photo0" ACCEPT="image/*" /> (max. 100 kb)</td></tr>
(sem nekde nasel, ze se tam dava accept)
medden
Profil *
> Lze zjistit velikost obrazku a rozmery pred upload?
No, asi to pôjde dosť ťažko, pretože php je spracovaný na strane servera... Možno javascriptom.
Prípadne sa dá obmedziť: <input type="hidden" name="MAX_FILE_SIZE" value="300" /> ale nie presne získať (ale asi to získanie chceš na obmedzenie, takže toto postačí). Niektoré prehliadače to ale neberú: holt majú smolu. Mimochodom, keď užívateľ predsa pošle väčší súbor, tak na server myslím dorazí iba prázdny request (tzn treba to ošetriť).

> Lze zjistit rozmery obrazku jinak nez pres GD
Asi si to ozaj zle používal, lebo podľa manuálu:
Note: The getimagesize() function does not require the GD image library.
Možno si namiesto cesty dával obsah obrázka ...
peta
Profil *
medden
getimagesize() Ano, sory, sem prehlid ve zdroji...
http://www.builder.cz/art/php/rsupload.html
Mel jsem tam jinou chybu. Chtel jsem treti polozku pole a nejak jsem to spatne zapsal a pouzival jsem proste treti pismenko z nazvu souboru.

Jinak presne, slo mi o velikost. Momentalne to mam osetrene tak, ze pokud mi ve file prijde "" tak se nic nevykona.
Zkusim to maxsize.
Mi osobne je to celkem jedno, ale predstav si pripad, ze ti nekdo zacne posilat 100M obrazek, ktery se nakonec stejne odmitne.
Nekde jsem cetl, mozna v tom clanku, ze server ma nejake omezeni pro velikost souboru, jak se to da zobrazit, kolik to je?

A potom by se mi mozna jeste hodil transformacni script na zmenu rozmeru.
Zatim pouzivam jen pri zobrazovani, ale pozdji bych nahral velikou foto a chtel zmensit na 80x80, plus spravny pomer stran.
cast vypisovaciho scriptu vypada ted takto:
$photo = $row2['i1_photo0'];
if ($photo!=="" && File_Exists($photo))
{
$w0=80;$h0=80;
$alt = ($name!=="")?$name:substr($photo,strrpos($photo,"/")+1);
$img = GetImageSize($photo); // vyuziti knihovny GD pro zjisteni rozmeru obrazku, 0 sirka, 1 vyska, 2 typ (gif), 3 string height=xxx width=xxx
$w=$img[0];
$h=$img[1];
if ($w!==$w0 || $h!==$h0)
{
if ($w>$h) {$h=floor($h*$w0/$w);$w=$w0;}
else {$w=floor($w*$h0/$h);$h=$h0;}
}
$wh='width="'.$w.'" height="'.$h.'"';
$photo = '<img src="'.$photo.'" '.$wh.' alt="'.$alt.'" />';
}
peta
Profil *
a, pardon, v kodu jsem nesmazal popisek s tim GD, coz jsem se mylil...
peta
Profil *
medden
Asi neco delam spatne s tim maxsize...

<input type="hidden" name="MAX_FILE_SIZE" value="<?=$maxsizePhotoi?>" />

<tr> <td><?=$lng['i1_Photo']?>1</td>
<td>
<input type="file" value="<?=$p[12]?>" name="i1_photo0" ACCEPT="image/*" /> (max. <?=$maxsizePhotoi?>b)</td></tr>


Firefox mi to nebere zadny soubor.
Suta
Profil
Já jsem si dle různých návodů udělal tento script, vytvoří ti velké fotky a zároveň i náhledové v přesném poměru, pouze si uprav, jakou délku má mít vždy delší strana obrázku. Vykastroval jsem to co to jen šlo, snad se v tom vyznáš, v komentářích by to mělo být snad přehledně :)



if(isset($odeslano_fotka)) { //byl odeslán formulář?

$uspesnost_vyplnovani=true; //předpokládáme úspěšný zápis

if($picture_name!="")
{ //byl odeslán obrázek
$informace = getimagesize($picture); /* v $informace[0] je šířka obrázku v pixelech, v $informace[1] je výška, v $informace[2] je typ obrázku vyjádřený číslem: 1=gif, 2=jpeg, 3=png */
$sirka_obrazku = $informace[0];
$vyska_obrazku = $informace[1];
$typ_obrazku = $informace[2];
if($typ_obrazku=="1" || $typ_obrazku=="2" || $typ_obrazku=="3")
{ //jedná se o námi akceptovatelný obrázek?
if($picture_size>1536000)
{ //je velikost obrázku do 1,5 MB
$chybova_hlaska = 'Příliš velký obrázek - vlož, prosím, jiný (do 1,5 MB).';
$uspesnost_vyplnovani=false;
}
else
{ //do proměnných uložíme jména funkcí a koncovky v závislosti na typu obrázku
if($typ_obrazku=="1")
{
$koncovka = "jpg";
$src_function = "ImageCreateFromGIF";
$dst_function = "ImageJPEG";
}
elseif($typ_obrazku=="2")
{
$koncovka = "jpg";
$src_function = "ImageCreateFromJPEG";
$dst_function = "ImageJPEG";
}
elseif($typ_obrazku=="3")
{
$koncovka = "jpg";
$src_function = "ImageCreateFromPNG";
$dst_function = "ImageJPEG";
}

$picture = StripSlashes($picture); //odstraníme escape sekvence z názvu souboru
$unique = UniqID(""); //vytvoříme unikátní ID obrázku

//zvětšení/zmenšení obrázku

// zjistím, která strana je větší, nastavím jí rozměr delší strany (400px) a druhé straně dopočítám poměr
$src = $src_function($picture); //načteme obrázek ze souboru
if ($sirka_obrazku > $vyska_obrazku)
{
$ratio = ImageSX($src)/400; //poměr zmenšení/zvětšení obrázku na šířku 400 px
$ratio_n = ImageSX($src)/100; //to samé vždy uděláme pro náhled
$height = Round(ImageSY($src)/$ratio); //výška obrázku při daném poměru
$height_n = Round(ImageSY($src)/$ratio_n);
$dst = ImageCreateTrueColor(400,$height); //vytvoříme prostor pro cílový obrázek
$dst_n = ImageCreateTrueColor(100,$height_n);
ImageCopyResampled($dst,$src,0,0,0,0,400,$height,ImageSX($src),ImageSY ($src)); //zmenšíme obrázek
ImageCopyResampled($dst_n,$src,0,0,0,0,100,$height_n,ImageSX($src),Ima geSY($src)); //zmenšíme obrázek
$dst_function($dst,"images_archiv/" . $unique . "." .$koncovka); //zapíšeme nový obrázek do souboru
$dst_function($dst_n,"images_archiv/" . $unique . "_n." .$koncovka);
ImageDestroy($src); //uvolníme paměť zdrojového obrázku
ImageDestroy($dst); //uvolníme paměť cílového obrázku
ImageDestroy($dst_n); //uvolníme paměť cílového obrázku
}
else
{
$pomer = ImageSY($src)/400; //poměr zmenšení/zvětšení obrázku na výšku 400 px
$pomer_n = ImageSY($src)/100; //to samé vždy uděláme pro náhled
$sirka = Round(ImageSX($src)/$pomer); //šířka obrázku při daném poměru
$sirka_n = Round(ImageSX($src)/$pomer_n);
$dst = ImageCreateTrueColor($sirka,400); //vytvoříme prostor pro cílový obrázek
$dst_n = ImageCreateTrueColor($sirka_n,100);
ImageCopyResampled($dst,$src,0,0,0,0,$sirka,400,ImageSX($src),ImageSY( $src)); //zmenšíme obrázek
ImageCopyResampled($dst_n,$src,0,0,0,0,$sirka_n,100,ImageSX($src),Imag eSY($src)); //zmenšíme obrázek
$dst_function($dst,"images_archiv/" . $unique . "." .$koncovka); //zapíšeme nový obrázek do souboru
$dst_function($dst_n,"images_archiv/" . $unique . "_n." .$koncovka);
ImageDestroy($src); //uvolníme paměť zdrojového obrázku
ImageDestroy($dst); //uvolníme paměť cílového obrázku
ImageDestroy($dst_n); //uvolníme paměť cílového obrázku
}
}
}
else
{ //nejedná se obrázek jpg, png ani gif
$chybova_hlaska = 'Nejedná se o obrázek typu JPG, PNG ani GIF, vlož, prosím, jiný.';
$uspesnost_vyplnovani=false;
}
}
else { //nebyla vybrána fotka k nahrání
$chybova_hlaska = 'Nebyla vybrána žádná fotografie pro nahrání.';
$uspesnost_vyplnovani=false;
}
if(IsSet($unique)) $odkaz_na_foto = $unique . "." . $koncovka; //vytvoříme cestu k obrázku

//vše proběhlo v pořádku - provedeme zápis do databáze
if($uspesnost_vyplnovani)
{
$add = MySQL_Query("INSERT INTO archiv_fotky VALUES ('$odkaz_na_foto' )") or die($chybova_hlaska_spojeni_s_databazi);



//tady může být kód, který vypíše hlášku o úspěšném nahrání fotografie a vytvoří možnost vložit další fotografii
?>

<? }
}







//tady je samotný formulář pro odeslání fotky

if (!$uspesnost_vyplnovani) //formulář zobrazujeme dokud nejsou zadány potřebné informace
{
if (IsSet($chybova_hlaska)) echo '<span class="chybova_hlaska">'.$chybova_hlaska.'</span>'; //chybová hláška
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="picture" size="25">
<br><br><input type="submit" name="send" value="Nahrát fotografii"></td>
<input type="hidden" name="odeslano_fotka">
<td>Zde nahrej fotografie.</td></tr>
</form>
<?
}
?>

peta
Profil *
Suta
Dik, ja, az to budu potrebovat, zkusim neco solidni taky vystarat na inetu, ale pro srovnani neni nikdy dost scriptu.
peta
Profil *
max size, sory, to jeste zkusim, chyba byla jinde. Sem zapomnel na jeden "$" u velikosti souboru, jsme zvykly psat promenne v JS bez nej.
medden
Profil *
> Nekde jsem cetl, mozna v tom clanku, ze server ma nejake omezeni pro velikost souboru, jak se to da zobrazit, kolik to je?
Jedná sa o direktívu post_max_size, môžeš to zistiť takto: echo ini_get("post_max_size");

btw: skús nabudúce dať radšej odkaz na kód skriptu, lebo je tu v tom ozaj bordel ;-)
Toto téma je uzamčeno. Odpověď nelze zaslat.