olen etsiskellyt netistä ja tältäkin foorumilta tietoa valokuvien (tallettamisesta) tietokantaan. ilmeisesti on niin, että ehkä järkevin tapa voisi olla itse kuvien talletus levyjärjestelmään ja kuvien tietojen talletus tietokantaan.
kuvien siirto www-sovelluksesta käsin levyjärjestelmään tehtäneen esim. exec() -funktiolla? kyseinen funkkari vain on kiellettyjen listalla palvelimallani.
onko muuta mahdollista funkkaria käytössä? eikai vain jouduta siihen, että kuvat siirretään käsin ftp:llä ja kuvien tunnistetiedot (nimi, osoite jne) lomakkeen kautta?
Onko move_uploaded_file() myös kielletty? Jos ei ole, nini voit siirtää kuvat lomakkeen file-kentän kautta, jolloin lähetyksen jälkeen kuvat tiedot ovat $_FILES['kuvakentän nimi'] taulukossa. Suositan erittäin vainoharhaista suhtautumista lähetettyjen tiedostojen sisältöön, koska täältä putkastakin löytyy esimerkkejä huonosti toteutetuista scripteistä.
ajv on kirjoittanut kuvien tallennuksesta tietokantaan jopa koodivinkin tänne Putkaan. https://www.ohjelmointiputka.net/koodivinkit/
katselin kyllä kyseisen koodivinkin läpi, mutta se ei oikein ainakaan suoraan vastaa tarpeitani: haluan nimenomaan tallettaa kuvat levyjärjestelmään enkä niinkään tietokantatauluun :-)
1) jos ensin katsotaan tiedostojen tallentamista levyjärjestelmään, niin se mennee jotenkin näin?
<?php <form action="upload.php" method="post" enctype="multipart/form-data"> <p> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> <input type="file" name="tiedosto" /><br /> <input type="submit" name="submit" value="Talleta"> <input type="reset" name="reset" value="Tyhjennä;"> </p> </form> ?>
ja vastaanottava php:
<?php $polku = "/polku/missa/tallennus/kansio/on/uploads/".$_FILES['tiedosto']['name']; if(move_uploaded_file($_FILES['tiedosto']['tmp_name'], $polku)) { print '<p>file was uploaded</p>'; } else { switch ($_FILES['uploadFile'] ['error']) { case 1: print '<p> The file is bigger than this PHP installation allows</p>'; break; case 2: print '<p> The file is bigger than this form allows</p>'; break; case 3: print '<p> Only part of the file was uploaded</p>'; break; case 4: print '<p> No file was uploaded</p>'; break; } } ?>
Sellaiseen en löytänyt netistä esimerkkiä, että miten tarkastan lähetettävän tiedoston tyypin vaastaanottavassa php-koodissa? hyväksyttyjä tyyppejä pitäisi olla vain: pdf, jpeg ja jpg
$_FILES["..."]["name"] muistaakseni sisältää myös tiedostopäätteen. Siitä vaan sitten explodella ottamaan viimeinen tekstinpätkä pisteen jälkeen ja vertaamaan noihin päätteisiin.
<?php $paatteet = array("pdf", "jpg", "jpeg"); $nimi = explode(".", $_FILES["tiedosto"]["name"]); $paate = $nimi[-1]; if(in_array($paate, $paatteet)) { // sallittu }
Eikö niin?
Muokkaus. Eikös koodissasi pitäisi tarkastella samaa kohtaa $_FILES-taulukossa?
Älä käytä ilmoitettu tiedostonimeä (kohtaa 'name') vaan luo uusi nimi vaikka tietokantarivin id:n perusteella (esim. 1.dat, 2.dat jne.). Tälle on kaksi erittäin hyvää syytä: näin vältytään törmäyksiltä (ei voi tulla useaa tiedostoa samalla nimellä), ja täysin oman nimen luonti varmistaa, että tiedostoa ei käsitellä esimerkiksi PHP-koodina.
Itse tarkistukseen ei ole mitään muuta kunnollista keinoa kuin tutkia tiedoston sisältämää dataa. (Tiedostonimi, jota Macro yllä ehdottaa, ei ole luotettava: mitä tahansa tietoa voi lähettää millä tahansa tiedostonimellä.) Seuraava tarkistustapa perustuu hyvin karkeisiin oletuksiin tiedoston alussa olevasta datasta, enkä ehtinyt tähän hätään tarkistaa sen ehdotonta toimivuutta, mutta idea käynee ilmi:
<?php function tyyppi($nimi) { $f = fopen($nimi, "r"); $data = fread($f, 16); fclose($f); if (strpos($data, "JFIF") !== false) return "jpg"; if (strpos($data, "PNG") !== false) return "png"; if (strpos($data, "PDF") !== false) return "pdf"; return null; } $t = tyyppi($_FILES['tiedosto']['tmp_name']); if ($t === null) { die("Virheellinen muoto!"); } // Tässä välissä rivin lisäys tietokantaan, sitten: $nimi = "$id.$t"; // esim. 1.png $polku = "/.../.../$nimi"; move_uploaded_file($_FILES['tiedosto']['tmp_name'], $polku);
Macro kirjoitti:
Siitä vaan sitten explodella ottamaan viimeinen tekstinpätkä pisteen jälkeen ja vertaamaan noihin päätteisiin.
Et voi hakea taulukon viimeistä solua käyttämällä indeksiä -1, se toimii merkkijonoihin joissain kielissä, mutta ei taulukoihin.
-tossu- kirjoitti:
Macro kirjoitti:
Siitä vaan sitten explodella ottamaan viimeinen tekstinpätkä pisteen jälkeen ja vertaamaan noihin päätteisiin.
Et voi hakea taulukon viimeistä solua käyttämällä indeksiä -1, se toimii merkkijonoihin joissain kielissä, mutta ei taulukoihin.
No, meneehän se näinkin.
<?php $paatteet = array("pdf", "jpg", "jpeg"); $nimi = explode(".", "tiedosto.jpg"); $paate = end($nimi); if(in_array($paate, $paatteet)) { echo "Sallittu pääte"; } else { echo "Ei sallittu"; } ?>
En ole pitkään aikaan PHP:llä tehnyt mitään, niin ei kaikki tule heti mieleen.
Mutta joo, ei kannata tiedostopäätteen avulla tuota tiedostotyyppiä tarkistaa...
Yksi vaihtoehto olisi PHP:n FTP
https://www.php.net/manual/en/ref.ftp.php
Sillä itse rakensin yhdelle palvelimelle tiedostojen latauksen.
make3003 kirjoitti:
Yksi vaihtoehto olisi PHP:n FTP
Tarkoitatko, että otat PHP:llä FTP-yhteyden localhost:iin ja siirrät tiedostot FTP:llä? Eihän siinä ole mitään järkeä.
-tossu- kirjoitti:
make3003 kirjoitti:
Yksi vaihtoehto olisi PHP:n FTP
Tarkoitatko, että otat PHP:llä FTP-yhteyden localhost:iin ja siirrät tiedostot FTP:llä? Eihän siinä ole mitään järkeä.
Periaatteesa ei olekaan, mutta itse jouduin käyttää tuota sitä varten, kun palvelimelle latasi käyttäen
move_uploaded_file($_FILES['tiedosto']['tmp_name'], $polku);
se ei määritellyt tiedostolle oikeata omistusta ja en saanut vaihdettua sitä kuin hallinnasta. Kun oli väärä omistus ei myös kuva näkyny sivuilla.
Muistaakseni PHP:n chown ei toiminut. Oletettavasti ei ollut valtuuksia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.