Autor Zpráva
moom
Profil
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
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
Omlouvám se, ten příklad použítí jsem uvedl špatně:
echo implode(" ", niceSize($size,1024));
Funkce vrací pole:
[velikost, jednotka]
moom
Profil
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
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
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
hmm... tak koukám, že jsem se nikam nepohnul... kurňa práce
Alphard
Profil
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
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
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
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));
jsem použil toto:
$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
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
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?

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: