Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: getimagesize i problem z jpg
Forum PHP.pl > Forum > Przedszkole
vvooki
Witam,
robię funkcję do skalowania jpgów.
Plan wygląda tak:
plik jest upoladowany z formularza i wgrywany do katalogu
potem jest robiona prewka i jednocześnie wrzucana do odpowiedniego katalogu.
Dla niektórych jpgów (np. 800/600 zapisanych z Photoshopa przez "Save for web") wszystko działa jak trzeba.
Problem zacznyna się w przypadku gdy próbuję wrzucić nie zmieniany plik 1,3Mb (koło 2000/1800px) bezpośrednio z cyfrówki (nie obrabianą w PS) - plik jak najbardziej się przegyrwa na serwer a problem powstaje dopiero w momencie w którym przez getimagesize() próbuję pobrać typ pliku i wielkość - funkcja poprostu nie zwraca żadnych wyników.
Czy ktoś miał kiedyś taki problem? Może jest jakaś metoda, żeby obejść tą funkcję?

Pozdrawiam
guma
shpyo
Spróbuj sobie wyświetlić nazwę pliku jaka jest pobierana, tablicę $_FILES etc. Bo tak to ciężko coś powiedzieć. Bo chyba mało prawdopodobne aby php się wykładało, tylko dlatego że plik ma 1,3MB.
vihoo
Może za niska wersja php nieradzaca sobie z typem jpg generowanym przez cyfrówkę. Zobacz http://pl2.php.net/function.getimagesize
vvooki
Tak wygląda funkcja:
  1. <?php
  2. function img_resize($path,$w=0,$h=0,$quality=100,$save=''){
  3.  
  4.   echo $path;
  5.   $image_data=@getimagesize($path);
  6.   echo 'image_data: 0: '.$image_data[0].' 1: '.$image_data[1].' 2: '.$image_data[2].' 3: '.$image_data[3];
  7.  
  8.   if($save=='') header('Content-type: '.$image_data['mime']); else $save=eregi_replace('%ext',$gd_ext[$image_type],$save);
  9.  
  10.   if($w!=0){
  11.    $rapporto=$image_data[0]/$w;
  12.    if($h!=0){
  13.      if($image_data[1]/$rapporto>$h) $rapporto=$image_data[1]/$h;
  14.    }
  15.   }elseif($h!=0){
  16.    $tmp_h=$image_data[1]/$h;
  17.   }else{
  18.    return false;
  19.   }
  20.  
  21.   $thumb_w=$image_data[0]/$rapporto;
  22.   $thumb_h=$image_data[1]/$rapporto;
  23.  
  24.   $img_src=@imagecreatefromjpeg($path);
  25.  
  26.   $img_thumb=@imagecreatetruecolor($thumb_w,$thumb_h);
  27.   $result=@imagecopyresampled($img_thumb,$img_src,0,0,0,0,$thumb_w,$thumb_h,$image_data[0],$image_data[1]);
  28.   if(!$img_src||!$img_thumb||!$result) return false;
  29.  
  30.   $result=@imagejpeg($img_thumb,$save,$quality);
  31.  
  32.   return $result;
  33. }
  34. ?>


poprawiam
---
nospor



Linijka z echo na początku jest do testów.
Okazało się że jest ok to znaczy:
0: 2048 1: 1536 2: 2 3: width="2048" height="1536"

Ale prewki w dalszym ciągu się nie tworzą...
Może ktoś znajdzie co jest w tym kodzie źle?...
mike
Usuń wszystkie @ to zobaczysz gdzie są błędy.
Na początku daj też:
  1. <?php
  2.  
  3. error_reporting( E_ALL );
  4. ini_set( 'display_errors', 1 );
  5.  
  6. ?>

będziesz pewien że wyświetlają się wszystko błędy.
vvooki
Dziękuję. Faktycznie błędy teraz pokazuje.
Dostałem coś takiego:
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 2048 bytes) in .... on line 51
W tej lini znajduje się funkcja imagecreatefromjpeg();
Czy to oznacza, że mało pamięci ma przydzielone samo php na serwerze?

ps. dostałem jeszcze coś takiego:
Notice: Use of undefined constant akcja - assumed 'akcja' in ... on line 63
kod tam wygląda tak: $akcja=$_GET[akcja];
czy coś w tym jest nie tak jak powinno?

Z góry dziękuję za odpowiedzi i pomoc
mike
Tak, oznacza to że php ma za mało pamięci i nie starcza jej na operacje na tym pliku.
Możesz zwiększyć przydział pamięci dla php, alebo zdecydować się na operacje na mniejszych plikach.

----edit----
Jeśli używasz tablic asocjacyjnych, nie ważne czy są superglobalne czy nie nie można pisać:
  1. <?php
  2.  
  3. echo $arrSomeTable[ someIndex ];
  4.  
  5. ?>

dlatego że nie masz takiej stałej jak someIndex.
Powinieneś zawsze używać znaków apostrofu:
  1. <?php
  2.  
  3. echo $arrSomeTable[ 'someIndex' ];
  4.  
  5. ?>
nospor
Co do akcji. POwinno byc:
  1. <?php
  2.  
  3.  $akcja=$_GET['akcja'];
  4.  
  5. ?>
vvooki
Cytat(mike_mech @ 2005-12-01 12:41:24)
Tak, oznacza to że php ma za mało pamięci i nie starcza jej na operacje na tym pliku.
Możesz zwiększyć przydział pamięci dla php, alebo zdecydować się na operacje na mniejszych plikach.

Ale ponieważ skrypt piszę nie na swoim serwerze tylko na wykupionym miejscu u providera i tam phpinfo() wypisuje samo że ma 8Mb to znaczy, że jest to ustawienie globalne i sam go nie zmienię?... :-(
mike
Cytat(vvooki @ 2005-12-01 13:43:27)
Ale ponieważ skrypt piszę nie na swoim serwerze tylko na wykupionym miejscu u providera i tam phpinfo() wypisuje samo że ma 8Mb to znaczy, że jest to ustawienie globalne i sam go nie zmienię?... :-(

Nie. Musi to zrobić administrator serwera.
vvooki
Ok. Bardzo dziękuję.
Sporo się nauczyłem... idę walczyć z providerem aarambo.gif

Pozdrawiam
Guma
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.