Autor Zpráva
kikinet
Profil
Zdravím,
mám skript, který zpracovává fotky, ukládá jméno do db atd. Všechno funguje do doby, kdy měním velikost obrázku a ukládám ho do adresáře. Někde v vtom momentě je chyba, protože fotky se v adresáři neukážou.
Položky jako ['tmp_name'], ['url'], $name se načítají bez problémů. $photos[$keys[$i]]['url']['url_orig'].$name vypíše slozka/slozka2/nazev.jpg (u "slozka2" je nastaven chmod 777). Nevím jak mám ale odzkoušet nahrávání a resamplování fotek...

    //zmenšení nejdelší strany na 600px
      $size = getImageSize($photos[$keys[$i]]['tmp_name']);        //size[0] = width, size[1] = height
      $ratio = $size[1]/$size[0];                                  //poměr stran
      $img = imageCreateFromJpeg($photos[$keys[$i]]['tmp_name']);  //načtení původního obrázku
      if ($size[1]>=$size[2]) {
        $imgorig = imageCreateTrueColor(600/$ratio,600);           //pro zmenšenou fotku
        $imgthumb = imageCreateTrueColor(150,150);                  //pro miniaturu fotky 
        $imgorig = imagecopyresampled($imgorig, $img, 0, 0, 0, 0, 600/$ratio, 600, $size[0], $size[1]);             //zmenšený
        $imgthumb = imagecopyresampled($imgthumb, $imgorig, 0, 0, 0, ($size[1]-150)/2, 150, 150, 600/$ratio, 600);  //miniatura         
      }
      else {
        $imgorig = imageCreateTrueColor(600,600*$ratio);
        $imgthumb = imageCreateTrueColor(150,150);
        $imgorig = imagecopyresampled($imgorig, $img, 0, 0, 0, 0, 600/$ratio, 600, $size[0], $size[1]); 
        $imgthumb = imagecopyresampled($imgthumb, $imgorig, 0, 0, 0, ($size[0]-150)/2, 150, 150, 600/$ratio, 600);
      };
    //uložení fotek do adresáře  
      move_uploaded_file($imgorig, $photos[$keys[$i]]['url']['url_orig'].$name);    
      move_uploaded_file($imgthumb, $photos[$keys[$i]]['url']['url_thumb'].$name);
      imageDestroy($imgorig);                                                   //uvolnění systémové paměti
      imageDestroy($imgthumb);

EDIT: Sekne se to hned v začátku. $img = imageCreateFromJpeg($photos[$keys[$i]]['tmp_name']);. Z nějakého důvodu to nezobrazí fotku, tudíž zbytek scriptu už je k ničemu. Ví někdo proč?
WertriK
Profil
 $img = imageCreateFromJpeg($photos[$keys[$i]]['tmp_name']);  //načtení původního obrázku

Ten původní obrázek je co za obrázek?
kikinet
Profil
WertriK:
to je myšleno jako nahraná fotka. Ta původní od uživatele, kterou chci já zmenšit a uložit
WertriK
Profil
Zkus nejdříve fotku přesunout na místo a potom změnit.

$img = imageCreateFromJpeg($photos[$keys[$i]]['tmp_name']);
Ten obrázek nenačte, protože ho nenajde, řekneš fci pouze název obrázku, ale už ne složku (upload_tmp_dir).
Fce move_uploaded_file prauje právě s touto složkou pro dočasné soubory.

Tohle je taky dle mě blbost.
move_uploaded_file($imgorig, $photos[$keys[$i]]['url']['url_orig'].$name);
K uložení obrázku se používá fce ImageJPEG, ImagePNG, ImageGIF.
kikinet
Profil
WertriK:
Taky se teď dívám, že to všichni řeší nejdřív přesunem. Už to tu zkouším, ale ani tak nedostanu k tomu, aby se obrázek nahrál aspoň v původní velikosti do adresáře. Mm to teď zapsané takto (zbytek zakomentovaný)

$dest = "/".$photos[$keys[$i]]['url']['url_orig'].$name;
move_uploaded_file($photos[$keys[$i]]['tmp_name'], $dest);
místo uložení ($dest) vyhodí tohle - /photos/original/nature/neco.jpg
Ale nic se neděje

No a ještě: ImageJPEG přece jen zobrazí obrázek v prohlížeči ne?
Alphard
Profil
Spíš by bylo zajímavější vypsat tu zdrojovou cestu. Indexování $keys se mi zdá podezřelé. To je hromadný upload?
kikinet
Profil
Alphard:
Ano je to hromadný upload. Načítají se fotky do pole + kategorie fotky do jiného pole. Když to projedu Foreach() s tím, že prázdné soubory nemá ukládat, uloží se mi to na přeskáčku - Např: odešlou se tři inputy, ale prostřední nebude obsahovat fotku, což znamená, že se uloží 2 fotky - první s indexem 0 a druhá s indexem 2. Nevím jestli to je pochopitelné, proto tu dám ještě kód.

foreach ($photo as $key => $values) {         
      foreach ($values as $i => $value) {        // i = pořadí souboru  
        if ($photo['name'][$i] != '') {          //ošetření prázdných polí, proběhne 5x  <--
          $counter = $counter+1;                 //počítadlo pro počet nahraných souborů
          $photos[$i][$key] = $value;           
          $photos[$i]['group'] = $groups[$i];    //přiřazení kategorie 
        };               
      };            
    };                                                                            
    $counter = $counter/5;                       //výsledek počítadla vydělen 5 -------------^
    $keys = array_keys($photos);

Možná složité řešení, ale i výpis zdrojové cesty funguje
Alphard
Profil
Viz cz2.php.net/manual/en/features.file-upload.multiple.php

Pole pojmenovat stylem
<input name="photo[]" type="file" /><br />
<input name="photo[]" type="file" /><br />

A potom
foreach ($_FILES['photo']['tmp_name'] as $key => $file)
{
  move_uploaded_file($_FILES['photo']['tmp_name'][$key], $dest);
  // pro demonstraci, jak se dostat k dalším polím, jinak samozřejmě
  move_uploaded_file($file, $dest);
}

Jestli je to určeno na nahrávání datově velkých fotek, není to úplně šťastné. Lepší je nasadit javascript a uploadovat po jednotlivých fotkách, tyto velké dávky často padají na nastavených limitech.
WertriK
Profil
kikinet:
http://cz1.php.net/manual/en/function.imagejpeg.php
Parametr "filename" - "The path to save the file to...".

Zkus tohle
$dest = $_SERVER["DOCUMENT_ROOT"]."/".$photos[$keys[$i]]['url']['url_orig'].$name;
move_uploaded_file($photos[$keys[$i]]['tmp_name'], $dest);
kikinet
Profil
Alphard:
Formulář mám udělaný tím stylem. Moc to nechci přepisovat, navíc to řazení polí mi opravdu funguje jak má. Jen se nedostanu k tomu uložení. Javascript neovládám a v momentálním presu by se spíš hodilo jen nějak vyřešit ten problém v php. Nevím, zdá se mi to prostě bez chyby, výpisy atd...


WertriK:
taky nic.

Jak se teď ale dívám, už se mi jeden upload povedl, avšak 2 hodiny zpátky, jen mi to commander nezobrazil. Teď by mě fakt zajímalo, která verze skriptu to byla...
WertriK
Profil
Tak si zkus ještě vypsat chyby.
Úplně na začátek dej

error_reporting(E_ALL);

A po pokusu o upload musím obnovit v commandrovy obsah - možná bude fungovat ctrl + r (nevím jistě).
kikinet
Profil
Funguje tohle
      $dest = "./".$photos[$keys[$i]]['url']['url_orig'].$name;
      move_uploaded_file($photos[$keys[$i]]['tmp_name'], $dest);
Očividně chyběla tečka "./".$photos..., jinak tam žádná změna není.
Pak už ale zase dále nefunguje zmenšení fotky

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:

0