Autor | Zpráva | ||
---|---|---|---|
moom Profil |
#1 · Zasláno: 20. 9. 2012, 11:04:07
Lidi zlatí, našel jsem na webu tento kousek kódu, který vytváří náhledy
z originálních fotografii. Zdá se, že funguje jak má, ale rád bych přidal do odkazu pod obrázkem velikost souboru (aby měl návštěvník představu o jeho velikosti). Pokud by se originální obrázek neotevíral, ale rovnou stáhl, tak by to bylo ještě vychytanější. Máte prosím nějakou radu, jak získat velikost souboru? Kód mám následující a funkční ukázka zde. Jo a ještě prosím představa. Kamarád, chce mít na webu složku, kam bude nahrávat (FTP) fotografie a tato stránka by mu měla automaticky generovat náhledy s odkazem na originální soubor. každá fotka má cca 6MB, proto náhledy, aby se nestahoval originál do prohlížeče. <?php # SETTINGS $max_width = 200; $max_height = 200; function getPictureType($ext) { if ( preg_match('/jpg|jpeg/i', $ext) ) { return 'jpg'; } else if ( preg_match('/png/i', $ext) ) { return 'png'; } else if ( preg_match('/gif/i', $ext) ) { return 'gif'; } else { return ''; } } function getPictures() { global $max_width, $max_height; if ( $handle = opendir(".") ) { $lightbox = rand(); echo '<ul id="pictures">'; while ( ($file = readdir($handle)) !== false ) { if ( !is_dir($file) ) { $split = explode('.', $file); $ext = $split[count($split) - 1]; if ( ($type = getPictureType($ext)) == '' ) { continue; } if ( ! is_dir('thumbs') ) { mkdir('thumbs'); } if ( ! file_exists('thumbs/'.$file) ) { if ( $type == 'jpg' ) { $src = imagecreatefromjpeg($file); } else if ( $type == 'png' ) { $src = imagecreatefrompng($file); } else if ( $type == 'gif' ) { $src = imagecreatefromgif($file); } if ( ($oldW = imagesx($src)) < ($oldH = imagesy($src)) ) { $newW = $oldW * ($max_width / $oldH); $newH = $max_height; } else { $newW = $max_width; $newH = $oldH * ($max_height / $oldW); } $new = imagecreatetruecolor($newW, $newH); imagecopyresampled($new, $src, 0, 0, 0, 0, $newW, $newH, $oldW, $oldH); if ( $type == 'jpg' ) { imagejpeg($new, 'thumbs/'.$file); } else if ( $type == 'png' ) { imagepng($new, 'thumbs/'.$file); } else if ( $type == 'gif' ) { imagegif($new, 'thumbs/'.$file); } imagedestroy($new); imagedestroy($src); } echo '<li><a href="'.$file.'">'; echo '<img src="thumbs/'.$file.'" alt="" />'; echo '</a><a href="'.$file.'">Stáhnout foto: '.$type.')</a></li>'; } } echo '</ul>'; } } ?> <!DOCTYPE html> <html lang="cs"> <head> <meta charset="utf-8" /> <title>Fotografie</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width"> <style type="text/css"> #pictures li { float:left; height:<?php echo ($max_height + 10); ?>px; list-style:none outside; width:<?php echo ($max_width + 10); ?>px; text-align:center; } img { border:0; outline:none; } a { display:block; } </style> </head> <body> <?php getPictures(); ?> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> </body> </html> |
||
Darker Profil |
Velikost souoru zjistíš PHP funkci filesize(název).
Vynutit stažení souboru lze hlavičkou: header("Content-Type: image/png"); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=$filename"); header("Content-Length: ".filesize($filename)); Možná by se ti mohla hodit tahle funkce na převádění jednotek: echo niceSize(filesize($filename),1024); function niceSize($size, $unitsize=1000) { $units = array("p","n",chr(0xB5),"m","","K","M","G","T"); $center = array_search("",$units,true); if($size<=10/$unitsize) { $current = 0; $cmpsize = 10/$unitsize; while(($current+$center-1)>=0&&$size<=$cmpsize) { $size*=$unitsize; $current--; } $res = array($size,($units[$center+$current])); } else { $current = 0; while(($center+$current+1)<count($units)&&$size>=$unitsize) { $current++; $size/=$unitsize; } $res = array($size,($units[$center+$current])); } return $res; } |
||
moom Profil |
#3 · Zasláno: 20. 9. 2012, 11:34:23 · Upravil/a: moom
Darker: Paráda, děkuji to byla rychlost, doplnil jsem tento řádek:
echo '</a><a href="'.$file.'">Stáhnout foto: ('.filesize($file).')</a></li>'; Můžu se prosím ještě zeptat, jak převedu jednotky na MB? A kam mám prosím doplnit tu hlavičku. Já jsem v PHP trošku knedla a začátečník. I když se začínám trošku orientovat :) Jejda, sotva jsem to napsal, koukám, že už je tu funkce na převod jednotek, ale já stejně netuším kam jím mám zařadit a jak ji vyvolat. No je vidět, že jsem skutečně začátečník... Kurňa práce... Tak jsem to doplnil takto, ale výsledek mně zapisuje jenom pole Array, Array, Array... <?php function niceSize($size, $unitsize=1000) { $units = array("p","n",chr(0xB5),"m","","K","M","G","T"); $center = array_search("",$units,true); if($size<=10/$unitsize) { $current = 0; $cmpsize = 10/$unitsize; while(($current+$center-1)>=0&&$size<=$cmpsize) { $size*=$unitsize; $current--; } $res = array($size,($units[$center+$current])); } else { $current = 0; while(($center+$current+1)<count($units)&&$size>=$unitsize) { $current++; $size/=$unitsize; } $res = array($size,($units[$center+$current])); } return $res; } # SETTINGS $max_width = 200; $max_height = 200; function getPictureType($ext) { if ( preg_match('/jpg|jpeg/i', $ext) ) { return 'jpg'; } else if ( preg_match('/png/i', $ext) ) { return 'png'; } else if ( preg_match('/gif/i', $ext) ) { return 'gif'; } else { return ''; } } function getPictures() { global $max_width, $max_height; if ( $handle = opendir(".") ) { $lightbox = rand(); echo '<ul id="pictures">'; while ( ($file = readdir($handle)) !== false ) { if ( !is_dir($file) ) { $split = explode('.', $file); $ext = $split[count($split) - 1]; if ( ($type = getPictureType($ext)) == '' ) { continue; } if ( ! is_dir('thumbs') ) { mkdir('thumbs'); } if ( ! file_exists('thumbs/'.$file) ) { if ( $type == 'jpg' ) { $src = imagecreatefromjpeg($file); } else if ( $type == 'png' ) { $src = imagecreatefrompng($file); } else if ( $type == 'gif' ) { $src = imagecreatefromgif($file); } if ( ($oldW = imagesx($src)) < ($oldH = imagesy($src)) ) { $newW = $oldW * ($max_width / $oldH); $newH = $max_height; } else { $newW = $max_width; $newH = $oldH * ($max_height / $oldW); } $new = imagecreatetruecolor($newW, $newH); imagecopyresampled($new, $src, 0, 0, 0, 0, $newW, $newH, $oldW, $oldH); if ( $type == 'jpg' ) { imagejpeg($new, 'thumbs/'.$file); } else if ( $type == 'png' ) { imagepng($new, 'thumbs/'.$file); } else if ( $type == 'gif' ) { imagegif($new, 'thumbs/'.$file); } imagedestroy($new); imagedestroy($src); } echo '<li><a href="'.$file.'">'; echo '<img src="thumbs/'.$file.'" alt="" />'; echo '</a><a href="'.$file.'">Stáhnout foto: ('.filesize($file).')</a></li>'; echo niceSize(filesize($filename),1024); } } echo '</ul>'; } } ?> <!DOCTYPE html> <html lang="cs"> <head> <meta charset="utf-8" /> <title>Fotografie</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width"> <style type="text/css"> #pictures li { float:left; height:<?php echo ($max_height + 10); ?>px; list-style:none outside; width:<?php echo ($max_width + 10); ?>px; text-align:center; } img { border:0; outline:none; } a { display:block; } </style> </head> <body> <?php getPictures(); ?> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> </body> </html> |
||
Darker Profil |
#4 · Zasláno: 20. 9. 2012, 11:55:32
Omlouvám se, ten příklad použítí jsem uvedl špatně:
echo implode(" ", niceSize($size,1024)); [velikost, jednotka] |
||
moom Profil |
#5 · Zasláno: 20. 9. 2012, 12:08:46
Darker: To se neomlouvejte, já děkuji za čas, který mně věnujete.
Nicméně jsem doplnil tento řádek, ale tentokrát mně to píše: 0p 0p 0p... Ukázka je stále funkční, pro ilustraci |
||
Darker Profil |
#6 · Zasláno: 20. 9. 2012, 12:30:30
Ta funkce co jsem vám předal je asi nějaká starší verze - pokud dostane nulu vrátí 0 piko (nejmenší možná jednotka). Ale to je detail, hlavní problém bude v tom, že funkci nulu předáváte. Nemáte tam překlep v názvu proměnné?
Máte zaplé hlašení všech chyb, včetně E_NOTICE? |
||
moom Profil |
#7 · Zasláno: 20. 9. 2012, 12:56:39
Darker: Děkuji, děkuji, zkopíroval jsem pouze kód, žádnou změnu jsem nedával.
Celá složka jde zde (ZIP) Webhosting mám u cesky-hosting, a nikde jsem E_NOTICE nezapínal. Celý kód je tento: <?php function niceSize($size, $unitsize=1000) { $units = array("p","n",chr(0xB5),"m","","K","M","G","T"); $center = array_search("",$units,true); if($size<=10/$unitsize) { $current = 0; $cmpsize = 10/$unitsize; while(($current+$center-1)>=0&&$size<=$cmpsize) { $size*=$unitsize; $current--; } $res = array($size,($units[$center+$current])); } else { $current = 0; while(($center+$current+1)<count($units)&&$size>=$unitsize) { $current++; $size/=$unitsize; } $res = array($size,($units[$center+$current])); } return $res; } # SETTINGS $max_width = 200; $max_height = 200; function getPictureType($ext) { if ( preg_match('/jpg|jpeg/i', $ext) ) { return 'jpg'; } else if ( preg_match('/png/i', $ext) ) { return 'png'; } else if ( preg_match('/gif/i', $ext) ) { return 'gif'; } else { return ''; } } function getPictures() { global $max_width, $max_height; if ( $handle = opendir(".") ) { $lightbox = rand(); echo '<ul id="pictures">'; while ( ($file = readdir($handle)) !== false ) { if ( !is_dir($file) ) { $split = explode('.', $file); $ext = $split[count($split) - 1]; if ( ($type = getPictureType($ext)) == '' ) { continue; } if ( ! is_dir('thumbs') ) { mkdir('thumbs'); } if ( ! file_exists('thumbs/'.$file) ) { if ( $type == 'jpg' ) { $src = imagecreatefromjpeg($file); } else if ( $type == 'png' ) { $src = imagecreatefrompng($file); } else if ( $type == 'gif' ) { $src = imagecreatefromgif($file); } if ( ($oldW = imagesx($src)) < ($oldH = imagesy($src)) ) { $newW = $oldW * ($max_width / $oldH); $newH = $max_height; } else { $newW = $max_width; $newH = $oldH * ($max_height / $oldW); } $new = imagecreatetruecolor($newW, $newH); imagecopyresampled($new, $src, 0, 0, 0, 0, $newW, $newH, $oldW, $oldH); if ( $type == 'jpg' ) { imagejpeg($new, 'thumbs/'.$file); } else if ( $type == 'png' ) { imagepng($new, 'thumbs/'.$file); } else if ( $type == 'gif' ) { imagegif($new, 'thumbs/'.$file); } imagedestroy($new); imagedestroy($src); } echo '<li><a href="'.$file.'">'; echo '<img src="thumbs/'.$file.'" alt="" />'; echo '</a><a href="'.$file.'">Stáhnout foto: ('.filesize($file).')</a></li>'; echo implode(" ", niceSize($size,1024)); } } echo '</ul>'; } } ?> <!DOCTYPE html> <html lang="cs"> <head> <meta charset="utf-8" /> <title>Fotografie</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width"> <style type="text/css"> #pictures li { float:left; height:<?php echo ($max_height + 10); ?>px; list-style:none outside; width:<?php echo ($max_width + 10); ?>px; text-align:center; } img { border:0; outline:none; } a { display:block; } </style> </head> <body> <?php getPictures(); ?> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> </body> </html> |
||
moom Profil |
#8 · Zasláno: 20. 9. 2012, 21:13:05 · Upravil/a: Moderátor (editace znemožněna) 20. 9. 2012, 22:44:32
hmm... tak koukám, že jsem se nikam nepohnul... kurňa práce
|
||
Alphard Profil |
#9 · Zasláno: 20. 9. 2012, 23:24:21
Je-li kód [#7] moom aktuální, místo
echo '</a><a href="'.$file.'">Stáhnout foto: ('.filesize($file).')</a></li>'; echo implode(" ", niceSize($size,1024)); raději echo '</a><a href="'.$file.'">Stáhnout foto: ('.implode(" ", niceSize(filesize($file),1024)).')</a></li>'; Darker psal v kontextu jednoho řádku [#4], ale nemůžete to kopírovat mechanicky. |
||
moom Profil |
#10 · Zasláno: 21. 9. 2012, 09:05:25
Alphard: Super, děkuji, už to jede. Sice mám velikost souboru: (33.763671875 K),
raději bych v MB, ale je to nad moje schopnosti. Ale už jsem si stáhl knihu ze zdejšího webu, abych rozšířil mé schopnosti HTML a CSS :) |
||
Darker Profil |
#11 · Zasláno: 21. 9. 2012, 11:19:23
moom:
„abych rozšířil mé schopnosti HTML a CSS :)“ To ti asi s tímhle nepomůže. Skript ti nefungoval proto, že jsi funkci předával nedefinovanou proměnnou $size namísto filesize(jméno). A co se týče těch desetinných míst: $velikost = niceSize(filesize($file),1024)); $velikost[0] = round($velikost[0]); //Zaokrouhleni hodnoty echo '</a><a href="'.$file.'">Stáhnout foto: ('.implode(" ", $velikost).')</a></li>'; |
||
moom Profil |
#12 · Zasláno: 21. 9. 2012, 13:17:44
Darker: No, trošku jsem to špatně napsal :) Rád bych se dostal hlouběji do tajů PHP,
znám jenom malé, hodně malé základy PHP, pokud máte nějakou knihu na doporučení, rad si nechám poradit. Jinak jsem odstranil jednu závorku a už mně to pěkně zaokrouhluje :) Místo: $velikost = niceSize(filesize($file),1024)); $velikost = niceSize(filesize($file),1024); Navíc jsem zjistil, že to stejně nefunguje na velké fotografie. Teprve teď jsem nahrál větší fotku 5MB a už to hlásí problém. Kurňa práce... Na toto jsem krátkej... Přiznávám bez mučení: Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 20736 bytes) |
||
Alphard Profil |
#13 · Zasláno: 21. 9. 2012, 20:47:08
moom:
„Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 20736 bytes)“ Nejčastější potíže s PHP (FAQ) » Překročení paměti |
||
moom Profil |
#14 · Zasláno: 21. 9. 2012, 21:59:36
Alphard: děkuji za pomoc. Snažil jsem se nějak zjednodušit vytváření náhledů
a stahovaní jejich originálů, ale vzdávám to a řeknu, že je lepší si třeba zdarma nainstalovat Fast Stone a dělat si náhledy sám. Teď mě napadlo, že kdyby existovala složka original a složka thumb, do které by si člověk nahrál fotografie se stejným názvem, že by aspoň PHP mohlo vytvořit stránku, která by si vzala fotky z obou umístění. Ze složky THUMB pro náhledy a ze složky original odkazy ke stažení. Ale na to jsou moje znalosti PHP moc malé... Rád bych se něco přiučil, ale netuším kam kouknout... Máte prosím nějakou radu? Kniha, odkaz? |
||
Časová prodleva: 12 let
|
0