Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: kuvat ja tietokanta

Sivun loppuun

volume [10.09.2010 12:33:55]

#

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?

Teuro [10.09.2010 12:47:09]

#

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ä.

Macro [10.09.2010 15:15:42]

#

ajv on kirjoittanut kuvien tallennuksesta tietokantaan jopa koodivinkin tänne Putkaan. https://www.ohjelmointiputka.net/koodivinkit/25135-php-kuvien-tallennus-mysql-tietokantaan

volume [10.09.2010 16:41:02]

#

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

Macro [10.09.2010 16:49:29]

#

$_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?

Metabolix [10.09.2010 16:52:13]

#

Ä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);

-tossu- [10.09.2010 16:59:49]

#

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.

Macro [10.09.2010 17:03:38]

#

-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.

RQ [10.09.2010 18:20:46]

#

<?php
    $tiedosto = "tiedosto.jpg";
    $paate = pathinfo($tiedosto, PATHINFO_EXTENSION);
    echo $paate;
?>

punppis [12.09.2010 01:46:09]

#

<?php
$rajahdys = explode(".", "tiedosto.jpg");
$paate = $rajahdys[count($rajahdys)-1];
?>

Mutta joo, ei kannata tiedostopäätteen avulla tuota tiedostotyyppiä tarkistaa...

make3003 [13.09.2010 12:07:15]

#

Yksi vaihtoehto olisi PHP:n FTP
https://www.php.net/manual/en/ref.ftp.php

Sillä itse rakensin yhdelle palvelimelle tiedostojen latauksen.

-tossu- [13.09.2010 15:07:00]

#

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ä.

make3003 [13.09.2010 18:37:16]

#

-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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta