Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tiedoston upload

Sivun loppuun

Vasta_alkaja [31.08.2009 22:46:52]

#

Tällä komennolla haettiin kuvasta tiedot,

$valittukuva = $_FILES["kuva"];

Mutta jos oikein muistan, niin tämä ei välttämättä anna kaikkea, esim kuvan päätettä. Olisiko tähän varmempaa konstia?

Vasta_alkaja [01.09.2009 01:04:28]

#

Kun valitsen kuvan ja katson sen tiedot print_r funktiolla, kuvan tyyppi on tyhjä. Miten tämä tulisi korjata.

<?php
/******************************************************************************/
include_once('./yhteys/config.php');

session_start();

if(!$_SESSION['tunnistus_avain']){
	header('location:./virhe.php');
}

$sivunnimi = 'admin_h.php';

/******************************************************************************/
?>
<html>
<head>
<style type="text/css">
.ilmoitus{
    background:white;
    padding:4px;
    border:1px solid black;
}
.nav{
    width:100%;
    padding:1px;
    border-bottom:3px solid #66CC66;
}
a{
  text-decoration:none;
  color:black;
}

.button{
  border-left:2px solid rgb(0,102,0);
  border-top:1px solid rgb(0,102,0);
  border-right:1px solid rgb(0,102,0);
  border-bottom:2px solid rgb(0,102,0);
  background:green;
  color:white;
}
.button:hover{
  border-left:1px solid rgb(0,102,0);
  border-top:2px solid rgb(0,102,0);
  border-right:2px solid rgb(0,102,0);
  border-bottom:1px solid rgb(0,102,0);
  background:green;
  color:yellow;
}
</style>
<title>Tiedoston lataaminen palvelimelle</title>
</head>
<body>

<table class="nav">
<tr>
    <td><a href="<?php echo $sivunnimi; ?>">Takaisin pääsivulle</a></td>
</tr>
</table>

<br />

<?php
if(!empty($_POST["lahetys"])){
    LataakuvaPalvelimelle();
}

function LataakuvaPalvelimelle(){
    $kansionnimi = 'images';

    // haetaan ladatun kuvan tiedot
    $valittukuva = $_FILES["kuva"];

    echo '<pre>', print_r($valittukuva), '</pre>';

    // Tarkistetaan onko kuvaa valittu
    if(empty($valittukuva)){
        return;
    }

    // Tarkistetaan onko kuvan tyyppinä jpeg tai gif, jos on mennään eteenpäin
    if($valittukuva['type'] == "image/jpeg" || $valittukuva['type'] == "image/jpeg" ||  $valittukuva["type"] == "image/gif"){

        // Tarkistetaan kuvan koko
        if($valittukuva['size'] >= 20000){
            echo 'Kuvan koko on liian suuri';
            return;
        }

        // merkki @ estää virheet siltä varalta, että hakemisto on jo olemassa.
        @mkdir("$kansionnimi");

        $kuvahakemisto = "$kansionnimi/";

        // Muutetaan nimi turvalliseksi
        $kuvannimi = rawurlencode($valittukuva["name"]);

        # Tarkistetaan onko tiedosto jo olemassa
        if (file_exists("$kuvahakemisto" . "$kuvannimi")) {
            echo "<p class='ilmoitus'>Samanniminen tiedosto on jo ladattu!</p>";
            return;
        }

        /* Tarkistaa, onko parametrina annettu tiedosto kelvollinen www-lomakkeen kautta
           palvelimelle ladattu tiedosto.ja siirtää sen lisäksi tiedoston
           haluttuun paikkaan. */

        if(move_uploaded_file($valittukuva["tmp_name"],
            $kuvahakemisto .
            $kuvannimi
            ))
        {

        $kuva = $kansionnimi.'/'.$valittukuva["name"];

        $paikka = strpos($valittukuva["name"], ".");
        if($paikka !== false) {
          $katkaisu = substr($valittukuva["name"], 0, $paikka);
        }

        $k = sprintf("INSERT INTO kuvagalleria SET
            kuva='%s',
            nimi='%s',
            sijainti=%d",
            get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes(trim($kuva))) : mysql_real_escape_string($kuva),
            get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes(trim($katkaisu))) : mysql_real_escape_string($katkaisu),
            intval($_POST['sijainti'])
            );

            if(!($t = mysql_query($k))){
                return;
            }

            //header("location:kuvanlataaminenpalvelimelle.php");
            echo '<p>Kuvan lataaminen on onnistunut</p>';
        }
        else
        {
            echo "<p>Kuvan siirtäminen haluttuun kansioon on epäonnistunut</p>";
        }
   }
   else{
            echo "<p>Kuvan tunniste on väärä. Salitut muodot on jpeg, jpg sekä gif. Jos tyyppi on kuitenkin oikea, ei kuvan tyyppiä voitu tunnistaa.</p>";
   }
}
?>
<form enctype="multipart/form-data" action="" method="post">
<table border="0" style="width:100%; border:1px solid black;"
    cellspacing="0">

<tr><td style="background:#66CC66;">&nbsp;</td></tr>
<tr>
<td style="background:white;">
    <input type="hidden" name="MAX_FILE_SIZE" value="20000">
    <br />&nbsp;Kuvatiedosto:
    <input type="file" name="kuva">

    <select name="sijainti">
      <option value="0"></option>
      <option value="1"> Etusivun valikkoon </option>
    </select>

    <input name="lahetys" type="submit"value="Lähetä">
    <br />
    <br />
</td>
</tr>
<tr><td style="background:#66CC66;">&nbsp;</td></tr>
</table>

</form>
</body>
</html>

Teuro [01.09.2009 06:55:55]

#

Yksi tapa olisi käyttää $_FILES['kuva']['type'], jonka jpg-kuville pitäisi olla muotoa image/jpeg. Tuosta sen voi joko parsia explodella, tai käyttää suoraan. Elikä siis

<?php
    if($kuvanTyyppi === "image/jpeg"){
        /* Tee jotakin */
    }

    $sallitut = array();
    $sallitut[] = "image/jpeg";

    /* Taulukoilla sama juttu */
    if(in_array($kuvanTyyppi, $sallitut)){
        /* Tee jotakin */
    }
?>

Vasta_alkaja [01.09.2009 10:11:51]

#

Mutta entäs jos arvo on tyhjä.

Teuro [01.09.2009 10:30:55]

#

Siis tiedostoilla on aina mime tyyppi, joka löytyy tuosta type taulukosta. Minkälaisen tiedoston laitat mtkaan, jos $_FILES['kuva']['type'] = tyhjä?

Metabolix [01.09.2009 10:45:59]

#

Tiedoston ilmoitettua MIME-tyyppiä ei missään tapauksessa kannata käyttää. Toisin kuin Teuro sanoo, sen oikeellisuudesta tai olemassaolosta ei ole mitään takeita: selain ei välttämättä tiedä sitä (ja saattaa siksi lähettää jotain yleipätevää kuten "application/octet-stream"), ja hakkeri voi kirjoittaa siihen mitä tahansa. Jos luotat siihen tarkistusmenetelmänä, sivustosi on vaarassa kärsiä surkean kohtalon.

Tiedostopäätteen huono puoli taas on, että tiedosto ei silloinkaan välttämättä ole sitä, miltä näyttää. Toisaalta tämäkin on jo turvallisempi ratkaisu, koska yleensä palvelimet eivät suorita esimerkiksi .jpg-päätteisiä tiedostoja PHP-tulkilla, vaikka sisältö olisikin PHP-koodia.

Ainoa varma vaihtoehto on tarkistaa myös tiedoston sisältö. Esimerkiksi kuvatiedoston voisi yrittää avata GD:n imagecreatefromstring-funktiolla, tosin tämä on melko rajoittunut tiedostomuotojensa suhteen. On myös joitakin ohjelmia ja kirjastoja, jotka ovat erityisesti erikoistuneet tiedostotyypin arvaamiseen, mutta en tiedä näiden PHP-tuesta. Tämä tapa on joka tapauksessa raskaampi kuin muut mainitut, joten jos et halua panostaa kovasti, luota vain tiedostopäätteeseen.

Contraband [01.09.2009 15:09:35]

#

Metabolix kirjoitti:

Ainoa varma vaihtoehto on tarkistaa tiedoston sisältö.

Vaikka tiedoston sisältökin varmistettaisiin formaatin mukaiseksi, on tiedostopääte silti syytä tarkistaa.

Tämä siitä syystä, että on mahdollista luoda täysin validi kuvatiedosto, joka sisältää (esimerkiksi JPEG-tiedoston kommenttikentässä) myös php-koodia. Mikäli päätettä ei tarkisteta, suorittaa PHP-tulkki kommenttikentässä olevan koodin php-päätteistä kuvatiedostoa kutsuttaessa. Ongelmaa vastaan voi taistella myös esimerkiksi konfiguroimalla palvelimen siten, ettei skriptejä voi suorittaa kuvakansiosta.

EDIT: Vasta_alkajan skriptissä on toinenkin ongelma. Ymmärtääkseni skriptin tarkoitus on uudelleenohjata käyttäjä muualle, mikäli istuntomuuttujaa tunnistus_avain ei ole asetettu. Nyt uudelleenohjauksen jälkeen kuitenkin tulostetaan alkuperäinen sivu selaimelle. Tämän seurauksena mahdollinen hyökkääjä voi asettaa ympäristönsä siten, ettei location-uudelleenohjausta noudateta, minkä seurauksena suojattuja sivuja on mahdollista käyttää kirjautumattomana.

Lisää header-rivin jälkeen exit-funktion kutsu ongelman korjaamiseksi. Näin käyttäjälle ei lähetetä alkuperäistä sivua lainkaan, vaan tehdään pelkkä uudelleenohjaus.

<?php
if(!$_SESSION['tunnistus_avain']){
    header('location:./virhe.php');
    exit();
}
?>

Vasta_alkaja [01.09.2009 17:46:00]

#

Periaatteessa tuolla .jpg tarkistuksella ei ole väliä, sillä jos käyttäjä on päässyt sinne asti niin homma on jo sillä selvä. Ovat voineet sotkea paljon muutakin :) Olisi vain mukava tuokin selvitellä miten se olisi järkevin tehdä.

Vasta_alkaja [03.09.2009 00:28:31]

#

$paikka = strpos($valittukuva["name"], ".");
if($paikka !== false) {
  $katkaisu = substr($valittukuva["name"], 0, $paikka);
}

Tällä tavallahan saan katkaistua sanan pisteen jälkeen, mutta miten saisin aloitettua sanan sen jälkeen.

esim.

kuva.jpg

Edellä mainittu antaa tuon kuvan, mutta haluaisin sen perästä tuon jpg arvon.

reca [03.09.2009 03:16:06]

#

Tän pitäis toimia...

<?php
function getFiletype( $filename )
{
    return strripos( $filename , '.' ) ? substr( $filename , strripos( $filename , '.' ) ) : false;
}
?>

TeNDoLLA [03.09.2009 09:13:58]

#

Tää on mun suosikki:

<?php
$paate = end(explode('.', $tiedosto));

Metabolix [03.09.2009 10:38:44]

#

Vasta_alkaja:

<?php
substr($valittukuva["name"], $paikka + 1);

TeNDoLLA:

TeNDoLLA kirjoitti:

<?php
$paate = end(explode('.', $tiedosto));

Strict Standards: Only variables should be passed by reference in /tmp/koe.php on line 2

TeNDoLLA [03.09.2009 10:52:19]

#

Niin siis onkos tuossa mun tavassa jotain häikkää?

Metabolix [03.09.2009 11:06:22]

#

On: end-funktion parametri on viittaus, ja siksi sille pitäisi antaa muuttuja eikä suoraan toisen funktion paluuarvoa. Sehän ei pelkästään palauta viimeistä arvoa vaan myös muuttaa PHP:n taulukkomuuttujan sisäistä tilaa. Koodi kyllä toimii, koska PHP katsoo kaikenlaista läpi sormien. Jos kuitenkin palvelimen asetuksissa on säädetty, että kaikenlaiset virheilmoitukset näytetään, siitä aiheutuu tuo ilmoitus. Jos parametrina olisi suoraan array-rivi (end(array("moi"))), tuloksena olisi vastaava Fatal error.

Tässä on vielä yksi vaihtoehto:

<?php
function extension($f) {
	$info = pathinfo($f);
	$e = &$info["extension"];
	return $e;
}
extension("koe.jpg"); // "jpg"
extension("koe.tar.gz"); // "gz"
extension("koe"); // NULL

Vasta_alkaja [03.09.2009 18:15:47]

#

Onko näillä mitään käytännön merkitystä, kumpaa käyttää.

<?php
substr($valittukuva["name"], $paikka + 1);

Paitsi, että alempi ei ole riippuvainen pisteestä ja tunnistaa tyhjän päätteen

<?php
function extension($f) {
    $info = pathinfo($f);
    $e = &$info["extension"];
    return $e;
}
extension("koe.jpg"); // "jpg"
extension("koe.tar.gz"); // "gz"
extension("koe"); // NULL

Metabolix [03.09.2009 18:33:02]

#

Vasta_alkaja kirjoitti:

Onko näillä mitään käytännön merkitystä, kumpaa käyttää.
--
Paitsi, että alempi ei ole riippuvainen pisteestä ja tunnistaa tyhjän päätteen.

Eipä muuta. Erillisen funktion käyttö on kuitenkin siksi suositeltavaa, että jokainen ymmärtää koodista, että extension($filename) palauttaa sen päätteen, kun taas substr($filename,strrpos($filename,'.')+1) vaatii tarkempaa lukemista eikä ole kovin selkeä. Lisäksi tyhjän tapauksen tunnistaminen oikein on aina hyvä ominaisuus; nythän skriptisi hyväksyisi esimerkiksi tiedoston nimeltä "Xjpg", vaikkei sen tiedostopääte olekaan jpg.

Vasta_alkaja [03.09.2009 18:40:13]

#

Kiitos Metabolix. Sinuun voi näköjään aina luottaa.

Vasta_alkaja [04.09.2009 15:33:24]

#

No niin. Näköjään olen siihen pisteeseen päässyt, että koodi menee eteenpäin aina seuraavaan kohtaan kohtaan asti.

if(move_uploaded_file($valittukuva["tmp_name"],
   $kuvahakemisto .
   $kuvannimi
))

Tämän jälkeen kuitenkin saadaan aikaiseksi virhe, koska $valittukuva["tmp_name"] on tyhjä. Kuinka tärkeää tämän arvon tarkistaminen on ja miten sen voisi tehdä muulla kuin $_FILES muuttujalla.

Metabolix [04.09.2009 15:49:40]

#

Siinä pitäisi kyllä aina olla arvo. Tarkista vielä, mitä tulostavat var_dump($_FILES) ja var_dump($valittukuva); voi olla, että koodissasi on jokin virhe.

Vasta_alkaja [04.09.2009 16:05:05]

#

var_dump($_FILES)

array(5) {
["name"]=>  string(15) "ahtari_ 011.jpg"
["type"]=>  string(0) ""
["tmp_name"]=>  string(0) ""
["error"]=>  int(2)
["size"]=>  int(0) }

var_dump($valittukuva)

array(1) {
["kuva"]=> array(5) {
["name"]=> string(15) "ahtari_ 011.jpg"
["type"]=> string(0) ""
["tmp_name"]=> string(0) ""
["error"]=> int(2)
["size"]=> int(0) }
}

Tuli vain nyt mieleen, että vaikuttaako se, että rassailen tätä paikallisella koneella. Tulisiko tämän olla toimiakseen palvelimella.

Metabolix [04.09.2009 17:28:34]

#

Tuossahan se paljastuukin: error = 2. Manuaali kertoo seuraavaa:

lainaus:

UPLOAD_ERR_FORM_SIZE
- Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.

Koodissasi määrittelet maksimikooksi (MAX_FILE_SIZE) 20 kilotavua.

Tarkista aina tarjolla olevat virhekoodit.

Vasta_alkaja [04.09.2009 21:45:18]

#

Kiitoksia Metabolix, kiitoksia paljon.

Vasta_alkaja [17.09.2009 22:07:13]

#

nyt on kaikki muuten oikein, mutta jos kuvan nimessä on väli ei sen näyttäminen sivuilla onnistu. Miten tämä tulisi korjata. Vai onko minulla taas vain koodissa jokin pieni virhe.

peg [18.09.2009 00:35:49]

#

Korvaa se välilyönti jollakin kelvolla merkillä. Osoiterivillä se on paha
koska monet selaimet, varsinkin pda:t eivät osaa välilyöntejä.
Korvaamiseen voit käyttää funktioita:
ereg_replace
preg_replace
str_replace

Grez [18.09.2009 08:50:50]

#

Siis mitä? Kyllähän kaikki selaimet osaavat välilyönnit. Välilyönti urlissa näyttää muuten seuraavalta: +

Eli äkkiseltään tulee mieleen, että jossain on jäänyt urlencode laittamatta.

Vasta_alkaja [20.09.2009 21:34:22]

#

Vielä on paljon opittavaa ja tuskin kaikkea koskaan tajuankaan, mutta. nyt en oikein ymmärtänyt tuota urlencodea.

1. Lataan kuvan palvelimelle, jonka nimi on esim.. kuva 1.jpg
Tuleeko tässä käyttää urlencodea.
2. Tallennan samalla osoitteen tietokantaan. esim. images/kuva 1.jpg
Tuleeko tässä käyttää urlencodea.
3. Haen MySql-kyselyllä kuvan tietokannasta.
Tuleeko tässä jo käyttää urlencodea.

Miten tämä tulisi tehdä niin, että se on järkevää ja oikeaoppisesti toteutettu?

Metabolix [20.09.2009 21:49:32]

#

1. Ei pidä.
2. Ei pidä.
3. Ei pidä. Vasta linkkiä muodostaessa pitää.

URL-enkoodaus on sitä varten, että osoitteen osaksi menevät tekstit eivät sisältäisi osoitteeseen sopimattomia merkkejä. Vain kirjaimet, numerot, piste, viiva ja alaviiva säilyvät, muut merkit muuttuvat enkoodattuun muotoon. Kysymysmerkillä ja &-merkillä on omat erikoiset merkityksensä; jos on tarkoitus antaa sivulle GET-parametrina A teksti 1?2&b=3, se täytyy URL-enkoodata, jottei sitä tulkittaisi väärin: 1%3Fa%26b%3D3, siis kokonaisuutena sivu.php?A=1%3Fa%26b%3D3.

Lisäksi pitää muistaa, että HTML:n seassa &-merkki aloittaa entiteetin (usein erikoismerkin, esim. &nbsp; tai &copy;), joten osoitteetkin pitää HTML-koodata ennen tulostamista.

Jokainen URLin osa pitää URL-enkoodata erikseen. (PHP:lle tuleva data taas dekoodautuu itsestään.) Kaikki sivulle tulostettavat asiat pitää HTML-enkoodata, ellei niiden ole erityisesti tarkoitus sisältää HTML-koodia. Yleisesti voidaan sanoa, että tekstinmuunnosfunktiot on parasta suorittaa viime hetkellä eli tässä tapauksessa juuri ennen tulostusta.

<?php
# oma sivu.php?jokin parametri=terve, matti&tervehdys=miten menee?
$s = rawurlencode("oma sivu.php"). "?". urlencode("jokin parametri"). "=". urlencode("terve, matti"). "&". urlencode("tervehdys"). "=". urlencode("miten menee?");
echo "<a href='", htmlspecialchars($s), "'>linkki</a>\n";

Vasta_alkaja [20.09.2009 22:22:56]

#

Näin minä sen oletinkin olevan, siksi hieman ihmettelinkin Grez:sin lähettämää vastausta ongelmaani. Oletettavasti minut oli ymmärretty väärin. Ongelmani onkin seuraava.

Tallennan palvelimell kuvan nimeltä : lapseni ensimmäinen syntymäpäivä.jpg
Tallennan kuvan osoiteen tietokantaan : images\lapseni ensimmäinen syntymäpäivä.jpg
Haen kuvan osoitteen tietokannasta ja yritän esittää sen ruudulla.
Tämä kuva ei näy, mutta jos korvaan tyhjät merkit esim alaviivalla ongelma poistuu.

Kysymys kuuluukin. Saanko kuvat näkymään näin, vai tuleeko minun kuvaa tallentaessa korvata tyhjät välit esim alaviivalla.

Metabolix [20.09.2009 22:34:35]

#

Miksi tallennat kantaan tuon images-osan?

Kokeilepa osoitteen enkoodausta rawurlencode-funktiolla. Sivun lähdekoodiin pitäisi tulla tällainen img-tagi:
<img src="images/valilyonti%20nimessa.jpg" alt="hassu kuva" />

Vasta_alkaja [20.09.2009 22:50:18]

#

$k = "SELECT kuva FROM kanta WHERE id = 1";
    if(!$t = mysql_query($k)) return;
    $r = mysql_fetch_assoc($t);

    $kuva = rawurlencode($r["kuva"]);

    if(empty($_REQUEST["kuva_".$sijainti])){
      if(empty($_REQUEST["kuva_".$sijainti])){
         if($kuva != 'ei'){
          echo "<br /><br /><img src='$kuva' width='150'>";
        }
      }
    }
    else
    {
        echo '<br /><br /><img src="'.rawurlencode($_REQUEST["kuva_".$sijainti]).'" width="150px;">';
    }

Page source : images%2Fahtari_%20018.jpg
Lopputulos : mikään kuva ei näy

Metabolix [20.09.2009 23:12:10]

#

Kysyinkin jo, miksi laitat tuon images-osan kantaan. Kauttaviivaa, joka erottaa hakemistot toisistaan, ei pidä enkoodata, kuten voit todeta korvaamalla tämän sivun osoitteesta /-merkin %2F:llä.

Vasta_alkaja [20.09.2009 23:52:30]

#

Ikävä tuottaa pettymys, mutta otin pois imagen eikä tominut. Taidan miettiä asiaa huomenna virkeänä uudelleen. Tuossa lataan kuvan palvelimelle. Näin äkkiseltään en siinä huomaa mitään, mutta jos satutte huomaamaan niin sekin olisi helpotus.

@mkdir("$kansionnimi");

        $kuvahakemisto = "$kansionnimi/";

        $kuvannimi = rawurlencode($valittukuva["name"]);

        # Tarkistetaan onko tiedosto jo olemassa
        if (file_exists("$kuvahakemisto" . "$kuvannimi")) {
            echo "<p class='ilmoitus'>Samanniminen tiedosto on jo ladattu!</p>";
            return;
        }

Kansiossa oleva kuva :

Hemmin%20ensimm%E4inen%20is%E4np%E4iv%E4%20001

Lähdekoodi :

images/Hemmin%20ensimm%E4inen%20is%E4np%E4iv%E4%20001.jpg

Metabolix [21.09.2009 12:50:33]

#

Aika erikoista, ettei mikään toimi.

Oletko varma, että ongelma on väleissä eikä ääkkösissä? Ne ovat nimittäin paljon yleisempi ongelmanlähde.

Näkyykö selaimella images-hakemiston listaus? Siitä näkisit ainakin toimivan linkin ja voisit testata, näkyykö kuva suoralla osoitteella.

Oma ratkaisuni olisi joka tapauksessa kieltää nimistä muut merkit kuin 0-9A-Za-z_-, vaikka sitten tietokantaan tallentaisi sen alkuperäisen nimen.

Vasta_alkaja [21.09.2009 12:58:45]

#

Hei Metabolix,

Tuo kieltäminenkin kyllä olisi varmaan hyvä ratkaisu, mutta sainkun sainkin tämän toimimaan. Kiitos sinun. Olit jälleen kerran oikeassa, mutta minäpäs olinkin reippaana unohtanut yhden oleellisen funktion ja jätin sen enkoodaamatta. Nyt kuitenkin toimii. kiitos.

Vasta_alkaja [21.09.2009 22:37:40]

#

Toimimaan, no miten sen nyt ottaa. Okei se toimi, mutta oli se nopeampi ja helpompi vain kieltää välit ja ääkköset. Tai no ei kieltää vaan muuttaa jos tarkkoja ollaan.

Kuitenkin, juuri voiton tunteen saatuani avaan IE explorerin ja valitettavasti käytän sitä nytkin huomaan todella kumman vian. Ei lataa kuvaa, ei. Ei muuta kuin var_dump:pi käyttöön ja tutkimaan.

array(1) { ["kuva"]=> array(5) { ["name"]=> string(14) "helmi_ 030.jpg" ["type"]=> string(11) "image/pjpeg" ["tmp_name"]=> string(21) "C:\wamp\tmp\php90.tmp" ["error"]=> int(0) ["size"]=> int(190611) } }

Ja sieltähän se löytyy. Mikä ihmeen p kijain on aina tuossa image/p ja sitten pääte?

<?php
$valittukuva = '';
$valittukuva = $_FILES["kuva"];

if(!empty($_POST["lahetys"])){
    LataakuvaPalvelimelle($valittukuva);
}

function extension($f) {
    $info = pathinfo($f);
    $e = &$info["extension"];
    return $e;
}

var_dump($_FILES);

function LataakuvaPalvelimelle($valittukuva){
    $kansionnimi = 'images';

    // haetaan ladatun kuvan tiedot

    //var_dump($valittukuva);

    // Tarkistetaan onko kuvaa valittu
    if(empty($valittukuva)){
        return;
    }


    if(empty($valittukuva["type"])){
      $valittukuva["type"] = 'image/'.extension($valittukuva["name"]);
    }

    // Tarkistetaan onko kuvan tyyppinä jpeg tai gif, jos on mennään eteenpäin
    if($valittukuva["type"] == 'image/jpg'
	|| $valittukuva["type"] == 'image/jpeg'
	|| $valittukuva["type"] == 'image/gif'
	|| $valittukuva["type"] == 'image/jfif'){

        // merkki @ estää virheet siltä varalta, että hakemisto on jo olemassa.
        @mkdir("$kansionnimi");

        $kuvahakemisto = "$kansionnimi/";

        // Muutetaan nimi turvallisemmaksi
        $korvattavat = array("ä", "ö", "å", " ");
        $kuvannimi = str_ireplace($korvattavat, "", "$valittukuva[name]");

        # Tarkistetaan onko tiedosto jo olemassa
        if (file_exists("$kuvahakemisto" . "$kuvannimi")) {
            echo "<p class='ilmoitus'>Samanniminen tiedosto on jo ladattu!</p>";
            return;
        }

        /* Tarkistaa, onko parametrina annettu tiedosto kelvollinen www-lomakkeen kautta
           palvelimelle ladattu tiedosto ja siirtää sen lisäksi tiedoston
           haluttuun paikkaan. */

        if($file["error"] != 0 && $valittukuva["size"] <= 0){
            echo 'Virhe kuvan latauksessa.';
            return;
        }

        if(move_uploaded_file($valittukuva["tmp_name"], $kuvahakemisto . $kuvannimi)){

        //$kuva = $kansionnimi.'/'.$valittukuva["name"];
        $kuva = $kansionnimi.'/'.$kuvannimi;

        $paikka = strpos($valittukuva["name"], ".");

        if($paikka !== false) {
          $katkaisu = substr($valittukuva["name"], 0, $paikka);
        }

        $k = sprintf("INSERT INTO kuvagalleria SET
            kuva='%s',
            nimi='%s',
            sijainti=%d",
            get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes(trim($kuva))) : mysql_real_escape_string(trim($kuva)),
            get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes(trim($katkaisu))) : mysql_real_escape_string(trim($katkaisu)),
            intval($_POST['sijainti'])
            );

            if(!($t = mysql_query($k))){
                echo mysql_error();
                return;
            }

            //header("location:kuvanlataaminenpalvelimelle.php");
            echo '<p>Kuvan lataaminen on onnistunut</p>';
        }
        else
        {
            echo "<p>Kuvan siirtäminen haluttuun kansioon on epäonnistunut</p>";
        }
   }
   else{
            echo "<p>Kuvan tunniste on väärä. Salitut muodot on jpeg, jpg sekä gif. Jos tyyppi on kuitenkin oikea, ei kuvan tyyppiä voitu tunnistaa.</p>";
   }
}
?>

tsuriga [21.09.2009 22:39:14]

#

Progressive JPEG, IE on erilainen nuor--- selain.

Vasta_alkaja [21.09.2009 22:53:06]

#

Eli kannattaako ne vain käytännössä laittaa sallittujen listalle?

$tyyppi = array("jpg", "gif", "jpeg", "pjpg", "pgif", "pjepg", "jfif", "pjfif");
if(in_array("$valittukuva[type]", $tyyppi)) {
 ja homma jatkuu.
}

tsuriga [21.09.2009 23:04:00]

#

Ei tuota p(rogressive)-etuliitettä taida nähdä muualla kuin jpegin yhteydessä. Getimagesize-funkkarillahan saisit selville, onko kyseessä oikeasti kuva (tosin en mene takaamaan toimintaa JFIF-formaatin kanssa).

Ps. Muuttujia ei tarvitse erikseen ympäröidä lainausmerkeillä.

Vasta_alkaja [22.09.2009 08:43:10]

#

Kiitoksia. Lisäänpä nuo muodot sitten huoletta listaan.

Grez [22.09.2009 08:59:03]

#

tsuriga kirjoitti:

Getimagesize-funkkarillahan saisit selville, onko kyseessä oikeasti kuva (tosin en mene takaamaan toimintaa JFIF-formaatin kanssa).

Käytännössä JFIF toimii varmasti, sillä käytännössä kaikki .jpg tai .jpeg -päätteiset tiedostot mitä vastaan tulee on JFIF formaatissa. JPEG-standardissa on JFIFin yleistymisen jälkeen määritelty SPIFF-formaatti, mutta se ei ole kovin yleisesti käytössä. Toisaalta SPIFF on pyritty tekemään alaspäin yhteensopivaksi JFIFin kanssa, joten todennäköisesti Getimagesize hanskaa myös SPIFF-muotoiset tiedostot.

tsuriga [22.09.2009 20:01:32]

#

Vasta_alkaja kirjoitti:

Lisäänpä nuo muodot sitten huoletta listaan.

Tarkoitit kai muodon?;) Edelleen siis mutu-pohjalla, mutta listaan tarvinnee lisätä vain "pjpeg". IE näköjään heittää sen MIME-tyypiksi huolimatta siitä, onko kuva oikeasti tallennettu Progressive- vai Baseline-muotoon.

Vasta_alkaja [22.09.2009 20:14:42]

#

Joo. Tarkoitin muodon :) Niin näyttää IE tekevän tuon kohdalla. Se toi suurta hämmennystä kun en tuommoisesta asiasta edes perillä ollut. Mutta onneksi apua on nopeaa ja lähellä kun sitä tarvitsee.

Kiitoksia todella paljon kaikille keskusteluun osallistuneille ja jospa minustakin joskus olisi teille apua. Helppo luvata kun siihen ei pysty :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta