예제 #1
0
 /**
 * HUOM! Tallentaa pikkukuvat tietokantaan ja alkuperäisen eri kansioon!
 * Kuvan tiedot on tarkistettu ennen tänne tuloa,
 * joten niitä ei tarkemmin tarkisteta täällä.
 *
 * SQL:
 * create table kuvat
     (
  id                    mediumint auto_increment not null,
  henkilo_id            tinyint not null,
  kuvaotsikko           varchar(200),
  kuvaselitys           varchar(5000),
  vuosi                 smallint default 0,
  kk                    tinyint default 0,
  paiva                 tinyint default 0,
  src                   varchar(300),
  leveys                smallint not null,
  korkeus               smallint not null,
  tiedostokoko          int not null,
  tiedostotunnus        varchar(20) not null,
  tiedostonimi          varchar(100) not null,
  tallennusaika_sek     int default 0,
  minikuva1             longblob,
  minikuva2             longblob,
  primary key (id),
  index(henkilo_id),
  index(tallennusaika_sek),
  index(jarjestysluku)
     );
 *
 * Tallentaa kuvan ja palauttaa taulukon, jonka ensimmäinen alkio on
 * palautte tallennuksen onnistumisesta ('onnistui' tai virheilmoitus) ja toinen
 * tallennetun kuvan id:n, jotta uusi kuva osataan näyttää heti.
 *
 * @param Parametrit $parametriolio
 * @return Array Palautetaulukko
 */
 public static function tallenna_kuva($parametriolio)
 {
     $omaid = $parametriolio->omaid;
     $uuden_kuvan_id = -1;
     //$_FILES['ladattu_kuva']:
     $ladattu_kuva = $parametriolio->ladattu_kuva;
     $kuvaotsikko_kuva = $parametriolio->kuvaotsikko_kuva;
     $kuvaselitys_kuva = $parametriolio->kuvaselitys_kuva;
     $vuosi_kuva = $parametriolio->vuosi_kuva;
     $kk_kuva = $parametriolio->kk_kuva;
     $paiva_kuva = $parametriolio->paiva_kuva;
     $tietokantaolio = $parametriolio->tietokantaolio;
     $id_lj = -1;
     // bongausalbumeiden näyttöä varten tarvitaan tämä.
     // Antaa sen kansion suhteellisen tiedostopolun,
     // jonne ladattu tiedosto on tarkoitus siirtää pysyvää sijoitusta varten.
     $latauskansio = $parametriolio->get_kuvien_kansio_osoite();
     // Vastaava pikkukuville:
     $pikkukuvakansio = $parametriolio->get_pikkukuvien_kansio_osoite();
     $palautustaulukko = array();
     $palaute = "";
     $taulu = "kuvat";
     $sarakenimi_kuvataulukko = array('henkilo_id', 'kuvaotsikko', 'kuvaselitys', 'vuosi', 'kk', 'paiva', 'src', 'leveys', 'korkeus', 'tiedostokoko', 'tiedostotunnus', 'tiedostonimi', 'tallennusaika_sek', 'minikuva1', 'minikuva2');
     if ($ladattu_kuva['tmp_name'] == "") {
         $palaute = "\$ladattu_kuva['tmp_name'] on tyhjä!";
     } else {
         $kuvatietotaulukko = getImageSize($ladattu_kuva['tmp_name']);
         $leveys = $kuvatietotaulukko[0];
         $kork = $kuvatietotaulukko[1];
         // Tiedostotunnisteet:
         $tunniste = $kuvatietotaulukko[2];
         //gif = 1/jpg = 2/png = 3/...
         //$html_lev_ja_kork = $kuvatietotaulukko[3];  // "height='333' width='455'"
         $koko = $ladattu_kuva['size'];
         // Koko tavuina (ilm.)
         if (!(is_numeric($leveys) && is_numeric($kork) && is_numeric($tunniste))) {
             $palaute = "getImageSize(\$ladattu_kuva['tmp_name'])-\n                            palautearvotaulukossa lev, kork tai tunniste\n                            epälukuja! (lev: " . $leveys . ", kork: " . $kork . "\n                            ja tunniste: " . $tunniste . ")";
             return $palaute;
         }
         /**********************************************************************/
         // Alla olevat liittyvät kuvan tallentamiseen tietokantaan tms:
         //$kuva = file_get_contents("vikakuva.img");
         /*$instr = fopen("vikakuva.img","rb");
           $kuva = addslashes(fread($instr,filesize("vikakuva.img")));*/
         // TÄMÄKIN TOIMII:
         /*$instr = fopen($ladattu_kuva['tmp_name'],"rb");
           $kuva = addslashes(fread($instr,filesize($ladattu_kuva['tmp_name'])));*/
         /***********************************************************************/
         // Kuvan nimeen lisätään tallennusaika sekunteina, jottei
         // duplikaatteja syntyisi. Samannimisiä kuvia voi kuitenkin tulla.
         // Kuvan tiedostonimeä ei muuteta.
         $tiedostonimi = time() . "_" . $ladattu_kuva['name'];
         $kohdeosoite = $latauskansio . "/" . $tiedostonimi;
         // Tiedostopolku minikuviin: eri kansio pikkukuville
         // ja lisätään nimeen miniloppu:
         $kohdeosoite_mini1 = $pikkukuvakansio . "/" . Kuva::$pikkukuva1_nimen_osa . $tiedostonimi;
         $kohdeosoite_mini2 = $pikkukuvakansio . "/" . Kuva::$pikkukuva2_nimen_osa . $tiedostonimi;
         $kohdeosoite_mini3 = $pikkukuvakansio . "/" . Kuva::$pikkukuva3_nimen_osa . $tiedostonimi;
         // IDEA: PIENENNÄ ENSIN 1600 -> 700 -> 400 -> 150 NIIN MENNEE
         // NOPSEMMIN. KUVALAATU SÄILYY IHAN OK!
         /******************************************************************/
         /******************************************************************/
         /* TÄSSÄ KUVAN KOKO TARKISTETAAN JA KUVA PIENENNETÄÄN, ETTEI
          * ÄLYTTÖMIÄ TULE. YLI 300 KT:N KUVAT PIENENNETÄÄN 1600 PIKSELIN
          * KOKOON, JOLLOIN MYÖS KUVAKOKO PIENENTYY. */
         if ($koko > Kuva::$KUVALATAUS_RAJAKOKO) {
             $max_mitta = Kuva::$KUVATALLENNUS_PIENENNOSMITTA;
             if (Kuva::muuta_kuvan_koko($ladattu_kuva['tmp_name'], $max_mitta, $kohdeosoite, 75)) {
                 // Haetaan pienennetyn kuvan uudet tiedot:
                 $kuvatietotaulukko = getImageSize($kohdeosoite);
                 $leveys = $kuvatietotaulukko[0];
                 $kork = $kuvatietotaulukko[1];
                 // Tiedostotunnisteet:
                 $tunniste = $kuvatietotaulukko[2];
                 //gif = 1/jpg = 2/png = 3/...
                 $koko = filesize($kohdeosoite);
                 //
             } else {
                 // Ellei onnistu, tallennetaan alkuperäinen:
                 $kuvatiedosto = $ladattu_kuva['tmp_name'];
                 move_uploaded_file($kuvatiedosto, $kohdeosoite);
             }
         } else {
             // Ellei pienennöstarvetta ole.
             $kuvatiedosto = $ladattu_kuva['tmp_name'];
             move_uploaded_file($kuvatiedosto, $kohdeosoite);
         }
         // Tehdään ensin 700 pikselin pienennös. Tätä ei tallenneta
         // tietokantaan, koska on suht iso kuitenkin.
         $max_mitta = Kuva::$TIETOKANTAKUVA_ISO2_MITTA;
         if (Kuva::muuta_kuvan_koko($kohdeosoite, $max_mitta, $kohdeosoite_mini3, 75)) {
             // Pienennetään sitten tätä kuvaa seuraavaan kokoluokkaan:
             $max_mitta = Kuva::$TIETOKANTAKUVA_ISO_MITTA;
             // Tänne kopioidaan pienennös, koska en keksinyt, miten muuten
             // kuvan saa tietokantaan:
             $kuvatiedosto = "../temp/muokkaus2.jpg";
             if (Kuva::muuta_kuvan_koko($kohdeosoite_mini3, $max_mitta, $kuvatiedosto, 75)) {
                 $minikuva2 = mysql_real_escape_string(file_get_contents($kuvatiedosto));
                 // Kopioidaan sama kuva myös kuvana tiedostoon, koskapa
                 // tietokannasta haku oli toivottoman hidasta!
                 copy($kuvatiedosto, $kohdeosoite_mini2);
                 // Pienennetään sitten tätä kuvaa seuraavaan kokoluokkaan:
                 $max_mitta = Kuva::$TIETOKANTAKUVA_PIENI_MITTA;
                 $kuvatiedosto = "../temp/muokkaus1.jpg";
                 // Tänne kopioidaan pienennös
                 // Luku tarkoittaa %:n laatua. Oletus on 75%.
                 if (Kuva::muuta_kuvan_koko($kohdeosoite_mini2, $max_mitta, $kuvatiedosto, 75)) {
                     $minikuva1 = mysql_real_escape_string(file_get_contents($kuvatiedosto));
                     // Kopioidaan sama kuva myös kuvana tiedostoon, koskapa
                     // tietokannasta haku oli toivottoman hidasta!
                     copy($kuvatiedosto, $kohdeosoite_mini1);
                 } else {
                     // Ellei minikuva1 onnistunut:
                     $minikuva1 = "";
                 }
             } else {
                 $minikuva2 = "";
             }
         } else {
             // Ellei minikuva3:kaan onnistunut:
             $minikuva1 = "";
             $minikuva2 = "";
         }
         $henkilo_id = $omaid;
         $tallennusaika_sek = time();
         $arvotaulukko = array($henkilo_id, $kuvaotsikko_kuva, $kuvaselitys_kuva, $vuosi_kuva, $kk_kuva, $paiva_kuva, $kohdeosoite, $leveys, $kork, $koko, $tunniste, $tiedostonimi, $tallennusaika_sek, $minikuva1, $minikuva2);
         // Palauttaa merkkijonon 'onnistui', jos tallennus onnistuu.
         $virheilmoitus = "Virhe kuvatietojen tallennuksessa (tallenna_kuva2)!";
         $onnistuikos = $tietokantaolio->tallenna_uusi_rivi($taulu, $sarakenimi_kuvataulukko, $arvotaulukko, $virheilmoitus);
         if ($onnistuikos == Tietokantaolio::$HAKU_ONNISTUI) {
             // Jos onnistui, lisätään linkki albumin ja kuvan välille.
             // Ainakin bongauksissa voidaan linkkejä tehdä monta kerralla.
             $uuden_kuvan_id = mysql_insert_id();
             $parametriolio->id_kuva = $uuden_kuvan_id;
             $onnistuiko_linkki = Kuva::tallenna_kuvalinkit($parametriolio);
             if ($onnistuiko_linkki === Kuva::$OPERAATIO_ONNISTUI) {
                 $palaute = 'onnistui';
             } else {
                 $palaute = 'Kuvan tallennus ok, mutta linkin tallennus ei
                     onnistunut!<br>' . $onnistuiko_linkki;
                 $uuden_kuvan_id = "";
                 // Uusi kuva ei kuitenkaan löydy.
             }
             // Aktiivisuusmerkintä:
             $viimeksi_aktiivi = time();
             $aktiivisuuslaji = Aktiivisuus::$KUVAN_LUOMINEN;
             paivita_aktiivisuus($omaid, $tietokantaolio, $viimeksi_aktiivi, $aktiivisuuslaji);
         } else {
             // Ellei kuvan tallennus onnistunut:
             $uuden_kuvan_id = "";
             $palaute = $onnistuikos;
         }
     }
     array_push($palautustaulukko, $palaute, $uuden_kuvan_id);
     return $palautustaulukko;
 }