Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Ukládání obrázku do složky na FTP a do db

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:22.8.2015 16:46

Ahojte, zase já :)

Vytvořil jsem si na testování podstránku k nahrávání souborů. Dostat jej do složky obrazky na FTPku je hračka, ale už se mi nedaří uložit název do databáze.

formulář:

<form method="post" enctype="multipart/form-data">
             <input type="hidden" name="ID" value="<?= htmlspecialchars( $_SESSION['obrazky']['ID']); ?>">
        <label for="file">Soubor:</label>
                        <input type="file" name="file" id="file" /> <br />
                      <label for="popis">Popis:</label>
                        <textarea cols="20" rows="5" name="popis" id="popis"></textarea>
        <input type="submit" value="Odeslat">
</form>

obslužný kontroler:

$_SESSION['obrazky'] =$obrazky= array(
                                        'ID' => $_POST["ID"],
                        'popis' => $_POST['popis'],
                        );
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 100000000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    $this->pridejZpravu("Return Code: " . $_FILES["file"]["error"] . "<br />");
    }
  else
    {
     $this->pridejZpravu("Upload: " . $_FILES["file"]["name"] . "<br />");
     $this->pridejZpravu("Type: " . $_FILES["file"]["type"] . "<br />");
     $this->pridejZpravu("Size: " . ($_FILES["file"]["size"] / 200000000) . " Kb<br />");
     $this->pridejZpravu("Temp file: " . $_FILES["file"]["tmp_name"] . "<br />");

    if (file_exists("obrazky/" . $_FILES["file"]["name"]))
      {
       $this->pridejZpravu("Soubor ".$_FILES["file"]["name"] . " již existuje. ");
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],"obrazky/" . $_FILES["file"]["name"]);

       if(isset($_FILES["file"]) && isset( $_SESSION["popis"])){
            $klice = array( 'popis');
            print_r($klice);
                        $obrazek = array_intersect_key($obrazek, array_flip($klice));
// Uložení článku do DB
                        $spravceInzeratu->ulozObrazek($_SESSION['obrazky']['ID'], $obrazek);
                        $this->pridejZpravu('Obrázek byl úspěšně uložen.');
                        $this->presmeruj('nejnovejsi');
            }
      $this->pridejZpravu("Uloženo v: " . "obrazky/" . $_FILES["file"]["name"]);
      }
    }
  }

a pro jistotu i metoda v modelu:

public function ulozObrazek($id, $obrazek){
    if (!$id){
                        Db::vloz('obrazky', $obrazek);
        }

                else
                        Db::zmen('obrazky', $obrazek, 'WHERE ID = ?', array($id));

}

metoda v Db.php:

public static function vloz($tabulka, $parametry = array()) {
                return self::dotaz("INSERT INTO `$tabulka` (`".
                implode('`, `', array_keys($parametry)).
                "`) VALUES (".str_repeat('?,', sizeOf($parametry)-1)."?)",
                        array_values($parametry));
        }

Mám v tom nějakou očividnou chybu? Když něco nahraje, tak to správně vypíše všechny zprávy, o velikosti souboru, uložení, typu atd.. ale v databázi mám pusto a prázdno.

Struktura tabulky:
ID int(11)
url varchar(40)
popis varchar (40)

později chci ještě přidat pole inzeratID aby se to svázalo, ale to přebíhám..

Díky za rady :-)

 
Odpovědět
22.8.2015 16:46
Avatar
katrincsak
Člen
Avatar
katrincsak:22.8.2015 18:04

(Třeba pro inspiraci)
Je to asi měsíc zpátky co jsem dělal stejnou věc. Spíše ti napíšu jak jsem to udělal já. Prvně jsem chtěl ukládat názvy do DB, ale není to pak na konec zbytečné? Mimochodem, taky se jedná o bazar.

Při vytváření inzerátu získáš samozřejmě jedinečný klíč na základě kterého vytvořím i s daným ID název složky do které nahraji fotky. Počet fotek kontroluji již před samotným nahráním, zároveň udělám kompresi velikosti a nahraji.

Při výpisu se zeptám o jaký inzerát se jedná a vypíšu obsah složky ID inzerátu, díky poli opět vypíšu přesně jen to co chci. Vypisuji z DB již jen základní popisy. Maximálně by se vyplatilo uložit název úvodní hlavní velké fotky ;-)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.8.2015 18:04
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal Kuba
katrincsak:22.8.2015 18:08

Nedal jsem odpovědět : /

 
Nahoru Odpovědět
22.8.2015 18:08
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na katrincsak
Michal Kuba:23.8.2015 16:03

takže se mám vykašlat pro ukládání do databáze? spíš mi PHP vytvoří složku třeba s ID inzerátu a tam už budou fotky?

 
Nahoru Odpovědět
23.8.2015 16:03
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:23.8.2015 16:42

Já to mam takhle:

Přeberu nahraný img, změním mu název např. na images8-23-2015_46841, ten hodim do složky images + uložím do databáze název.

Takže vše co udělám je jen přeberu název a uložím do DB :)

PS: A blbnou tu podtržítka, po images má být "_"

Editováno 23.8.2015 16:43
Nahoru Odpovědět
23.8.2015 16:42
Neaktivní uživatelský účet
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal Kuba
katrincsak:23.8.2015 17:46

Záleží proč by jsi to měl ukládat i do DB. Osobně mi to přijde jako zbytečná data a záleží jak dobře si přizpůsobíš ukládání do db, protože pakliže budeš mít na 1 název 1 sloupec, tak je to dost omezený.

1 inzerát = 1 složka s ID inzerátem = neomezený počet fotek (hlídá script, který to nahrává).
Pakliže se má inzerát smazat -> Smaže se ID inzerátu -> složka s ID i s fotkami uvnitř. 2 funkce.. Jedna vyprázdní složku a další smaže.

Pro svoje využití neznám důvod k čemu by mi byly data v DB. Maximálně úvodní fotka.

 
Nahoru Odpovědět
23.8.2015 17:46
Avatar
Odpovídá na katrincsak
Neaktivní uživatel:23.8.2015 17:56

Proč 1 název 1 sloupec ?
Však do jednoho řádku můžeš uložit několik názvu, např img1.jpg,img2­.jpg,img3.jpg ?

Nahoru Odpovědět
23.8.2015 17:56
Neaktivní uživatelský účet
Avatar
Nahoru Odpovědět
23.8.2015 18:05
Neaktivní uživatelský účet
Avatar
katrincsak
Člen
Avatar
Odpovídá na Neaktivní uživatel
katrincsak:23.8.2015 18:09

To můžeš a díky poly taktéž víš které pořadí jaká fotka má, ale to jsem jen tak napsal a použil zrovna nevhodný důvod. Protože dle popisu to stejně vypadá, že to nenahrává jako 1 řetězec.

Každopádně mi to přijde jako zbytečná data na víc a pakliže budu potřebovat vypisovat úplně přesně dané pořadí mohu právě přejmenovat název, očíslovat a vypisovat.

Editováno 23.8.2015 18:10
 
Nahoru Odpovědět
23.8.2015 18:09
Avatar
Karel Labonek:13.5.2018 18:12

Omlouvám se za své neznalosti, mohli by jste mě trochu nakopnout. Formulář-input-file potom pomocí

$obrazek = $_POST['obrazek']

si načtu z superglobálního pole soubor do proměnné a jak ho teď uložím do složky s ostatními fotkami ?
Moc děkuji za pomoc.

 
Nahoru Odpovědět
13.5.2018 18:12
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Karel Labonek
Petr Čech:14.5.2018 15:23

Můžeš se inspirovat třeba tady: https://www.w3schools.com/…e_upload.asp
Důležité je nevynechat ty kontroly, jestli jde o obrázek, jinak neexistuje důvod, proč by vám tam někdo nenahrál třeba PHP skript a nespustil is ho...

Nahoru Odpovědět
14.5.2018 15:23
the cake is a lie
Avatar
Nahoru Odpovědět
14.5.2018 21:52
Chybami se člověk učí, běžte se učit jinam!
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Petr Čech
Peter Mlich:15.5.2018 7:16

Ten script jde pribalit k tomu obrazku. Jpegy umi ruzne veci navic. Sam se nejspis nespusti, ale jestli obrazky uklada do slozky a nemeni nazev, tak by jej hacker mohl spustit z te slozky. Pokud tam nema spravne nastevena opravneni.

 
Nahoru Odpovědět
15.5.2018 7:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.