Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Php upload

Sivun loppuun

Rickken [30.12.2010 20:49:33]

#

Eli mikä näissä on oikeen vika, kun en tajua.
HUOM! Olen uusi näissä php jutuissa.

Koodi, joka liitetään sivulle:

<html>
<h1>Tästä lataa tiedostot palvelimelle!</h1>
<form action="upload.php" method="post" ecntype="multipar/form-data">
<input type="file" name="myfile"><p>
<input type="submit" value="Lataa!">


</form>
</html>

Ja tiedoston lataus ja muut höskät:

<?php

$name = $_FILES["myfile"]["name"];
$type = $_FILES["myfile"]["type"];
$size = $_FILES["myfile"]["size"];
$temp = $_FILES["myfile"]["tmp_name"];
$error = $_FILES["myfile"]["error"];

if ($error > 0)
{
die ("Tapahtui virhe, olemme pahoillamme! Virhe koodi: $error");
}
else
{
if ($type == "file/php");
{
die ("Lataus ei salli tätä tiedosto muotoa $type");
}
{
move_uploads_file($temp, Uploads/".$name);
echo "Lataaminen onnistui!";
}
}
?>

Antaa virheen, että virhe viivalla 21 eli tuossa echo kohdassa. Mikä oikein mättää?

-tossu- [30.12.2010 21:10:32]

#

Rickken kirjoitti:

Antaa virheen, että virhe viivalla 21 eli tuossa echo kohdassa. Mikä oikein mättää?

Kuten syntaksivärityksestäkin näkee, koodista puuttuu yksi lainausmerkki riviltä 20.

Kesti muuten hetken tajuta ilmaisu "viivalla 21". Yleensä "line" suomennetaan tällaisessa tapauksessa "rivi". :) Muutenkaan virheilmoituksia ei kannata suomentaa tai kertoa omin sanoin.

Grez [30.12.2010 22:05:43]

#

Pentu kirjoitti:

Mutta eikös myös 19. -riviltä puutu else... ton aaltosulkeen edestä?

Virheilmoitus johtuu kyllä minustakin siitä, että riviltä 20 puuttuu se lainausmerkki, kuten -tossu- sanoi. Ylimääräiset kaarisulut ei sinänsä (ainakaan muissa kielissä) aiheuta virhettä. Sehän kuolee joka tapauksessa DIEhin. Käsittääkseni edellä olevalla if:lläkään ei ole merkitystä, kun ) jälkeen on ;

Sinänsä en ymmärrä, miksei noita koodeja sisennetä. Helpottaisi omaakin elämää. Alla alkuperäinen koodi lisättynä yhdellä " -merkillä, kommenteilla ja kunnollisella sisennyksellä.

<?php

	$name = $_FILES["myfile"]["name"];
	$type = $_FILES["myfile"]["type"];
	$size = $_FILES["myfile"]["size"];
	$temp = $_FILES["myfile"]["tmp_name"];
	$error = $_FILES["myfile"]["error"];

	if ($error > 0)
	{
		die ("Tapahtui virhe, olemme pahoillamme! Virhe koodi: $error");
	}
	else
	{
		if ($type == "file/php"); //Huom, tämä if ei vaikuta alla oleviin

		{
			die ("Lataus ei salli tätä tiedosto muotoa $type");
		}

		//Tätä ei koskaan suoriteta, koska die
		{
			move_uploads_file($temp, "Uploads/".$name);
			echo "Lataaminen onnistui!";
		}
	}
?>

Pentu [30.12.2010 22:07:52]

#

Mutta eikös myös 19. -riviltä puutu else... ton aaltosulkeen edestä?

ville-v [30.12.2010 22:09:17]

#

Pentu kirjoitti:

Mutta eikös myös 19. -riviltä puutu else... ton aaltosulkeen edestä?

Se ei vaikuta ohjelman toimintaan.

Rickken [30.12.2010 22:36:37]

#

No nyt antaa tämän jutun, että ei salli tätä tiedostomuotoa vaikka kokeilin sinne vähän kaikki tiedostomuotoja. Hmmmmm...

-tossu- [30.12.2010 22:46:02]

#

Rickken kirjoitti:

No nyt antaa tämän jutun, että ei salli tätä tiedostomuotoa vaikka kokeilin sinne vähän kaikki tiedostomuotoja.

Otithan puolipisteen pois if-riviltä.

Grez: Laitoit puuttuvan lainausmerkin väärään kohtaan.

Rickken [30.12.2010 23:02:27]

#

Hmmph...
Koodi on nyt seuraavanlainen:

<?php

    $name = $_FILES["myfile"]["name"];
    $type = $_FILES["myfile"]["type"];
    $size = $_FILES["myfile"]["size"];
    $temp = $_FILES["myfile"]["tmp_name"];
    $error = $_FILES["myfile"]["error"];

    if ($error > 0)
    {
        die ("Tapahtui virhe, olemme pahoillamme! Virhe koodi: $error");
    }
    else
    {
        if ($type == "file/php")

        {
            die ("Lataus ei salli tätä tiedosto muotoa $type");
        }

        else
        {
            move_uploads_file($temp, Uploads/".$name");
            echo "Lataaminen onnistui!";
        }
    }
?>

Ja virhe on tälläinen:
Fatal error: Call to undefined function move_uploads_file() in /home/webhost/********/public_html/upload.php on line 21

Mikä tässä jälleen mättää?

Kiitos jo muuten edellisistä vastauksista, täältä saa nopeasti apua. :)

Grez [30.12.2010 23:04:26]

#

Rickken kirjoitti:

Fatal error: Call to undefined function move_uploads_file() in /home/webhost/********/public_html/upload.php on line 21

Mikä tässä jälleen mättää?

No sehän sanoo sen ihan suoraan. PHP:ssä ei ole funktiota move_uploads_file.

Saatat tarkoittaa tätä funktiota, joka on melkein saman niminen.
https://www.php.net/manual/en/function.move-uploaded-file.php

Ohjelmointikielille on tyypillistä että ne, toisin kuin ihmiset, eivät ymmärrä sanoja jotka on kirjoitettu melkein oikein.

-tossu- [30.12.2010 23:07:58]

#

Kohta Rickken varmasti kysyy, miksei koodi vieläkään toimi, joten sanon jo nyt, että korjaa rivi 23, koska siellä on lainausmerkki väärässä paikassa.

move_uploaded_file($temp, "Uploads/".$name);

Rickken [31.12.2010 12:14:11]

#

Noniiin nyt sain sen muuten toimimaan paitsi, että se ei siirrä tiedostoa tiedostoon: Uploads.
Tässä koodi jälleen kerran:

<?php

    $name = $_FILES["myfile"]["name"];
    $type = $_FILES["myfile"]["type"];
    $size = $_FILES["myfile"]["size"];
    $temp = $_FILES["myfile"]["tmp_name"];
    $error = $_FILES["myfile"]["error"];

    if ($error > 0)
    {
        die ("Tapahtui virhe, olemme pahoillamme! Virhe koodi: $error");
    }
    else
    {
        if ($type == "file/php")

        {
            die ("Lataus ei salli tätä tiedosto muotoa $type");
        }

        else
        {
            move_uploaded_file($temp, "Uploads/".$name);
            echo "Lataaminen onnistui!";
        }
    }
?>

villev [31.12.2010 13:17:18]

#

Kokeile muuttaa:

$name = basename($_FILES["myfile"]["name"]);

On myös aika riskialtista estää ainoastaan php-tiedostot: kannattaisi mieluummin sallia vain tietyt tyypit, joita tarvitaan.

Tämän lisäksi html-koodissasi on muutama typo.

Rickken [01.01.2011 02:01:07]

#

Onko tuo joku iso haitta vai jotain pieniä korjauksia vain, meinaa sitä, että uppiin pääsee vain tietyt ihmiset.

-tossu- [01.01.2011 02:24:04]

#

Rickken kirjoitti:

Onko tuo joku iso haitta vai jotain pieniä korjauksia vain, meinaa sitä, että uppiin pääsee vain tietyt ihmiset.

Ei tuo suuri haitta ole, jos kaikki käyttäjät ovat luotettavia.
Jos kuka tahansa voi käyttää uploadia, niin sitten tuo on suuri haitta; mikäli käyttäjä saa lähetettyä palvelimelle suoritettavaa koodia, esim. .php tai .py -tiedoston, voi sillä pahimmassa tapauksessa sekoittaa koko palvelimen tai kalastella salasanoja tms.

En kuitenkaan rajoittasi tiedostoja tyypin mukaan. Sen sijaan pitäisin huolen, ettei palvelin suorita missään nimessä mitään Uploads-hakemistossa olevia koodeja, vaan tarjoaa tiedoston sellaisenaan käyttäjälle.

Rickken [01.01.2011 12:50:06]

#

Juu, mutta ongelmani on se, että scripti ei siirrä tiedostoa Uploads kansioon.
Voisiko se toimia, että se siirtää ne suoraan nettiosoitteeseen?
Näin:
Eli 20 riville Uploads kohtaan: "http://osoitteeni.palveluntarjoaja.fi/Uploads"

???

-tossu- [01.01.2011 13:16:23]

#

Rickken kirjoitti:

Juu, mutta ongelmani on se, että scripti ei siirrä tiedostoa Uploads kansioon.

Minne se sitten siirtyy, vai siirtyykö sen minnekään? Tulostaako PHP-sivu "Lataaminen onnistui!"? Oletko jo korjanut HTML-koodin, jossa näyttää olevan kaksi typoa ihan vierekkäin: ecntype="multipar/form-data" .

Rickken kirjoitti:

Voisiko se toimia, että se siirtää ne suoraan nettiosoitteeseen?
Näin:
Eli 20 riville Uploads kohtaan: "http://osoitteeni.palveluntarjoaja.fi/Uploads"

Ei tuolla tavalla. Voihan sen tiedoston tietysti siirtää vaikka FTP:llä toiselle palvelimelle, en toisin tiedä, osaako move_uploaded_file siirtää sitä suoraan, jos sille antaa FTP-osoitteen. PHP tukee urleja aika monen tiedostofunktion kanssa, mutta en tiedä tuosta, vaikka eihän tuollaisessa tiedoston siirtämisessä eri palvelimien välillä ole paljoa järkeä.

Rickken [01.01.2011 14:50:08]

#

Se tulostaa, että "lataaminen onnistui!" mutta kun katson Uploads tiedostoa ei siellä ole mitään.
Eli näinkö se html koodi:

<html>
<h1>Tästä lataa tiedostot palvelimelle!</h1>
<form action="upload.php" method="post" ecntype="multipart/form-data">
<input type="file" name="myfile"><p>
<input type="submit" value="Lataa!">


</form>
</html>

-tossu- [01.01.2011 14:52:10]

#

Rickken kirjoitti:

kun katson Uploads tiedostoa ei siellä ole mitään.

Tuon Uploads:in kuuluu olla kansio.

Rickken kirjoitti:

Eli näinkö se html koodi:

ecntype > enctype

Rickken kirjoitti:

Se tulostaa, että "lataaminen onnistui!"

Kannattaisi muuten varmistaa, että move_uploaded_file palauttaa true, eikä vain tulostaa "Lataaminen onnistui!", vaikka mitään takeita siitä ei ole.

Rickken [02.01.2011 15:25:39]

#

Eli miten sen tekisin?

siika [02.01.2011 15:28:38]

#

if(move_uploaded_file($temp, "Uploads/".$name)){
            echo "Lataaminen onnistui!";
}
else {
            die("Lataaminen epäonnistui!");
}

Rickken [02.01.2011 20:11:21]

#

Hmm... mihin kohtaan tuo pitäisi laittaa?

-tossu- [02.01.2011 20:19:09]

#

Rickken kirjoitti:

Hmm... mihin kohtaan tuo pitäisi laittaa?

Move_uploaded_file-funktion eli rivin 23 tilalle.

Rickken [02.01.2011 21:04:50]

#

Eli nyt on seuraavanlainen koodi ja antaa vain, että epäonnistui.

<?php

    $name = $_FILES["myfile"]["name"];
    $type = $_FILES["myfile"]["type"];
    $size = $_FILES["myfile"]["size"];
    $temp = $_FILES["myfile"]["tmp_name"];
    $error = $_FILES["myfile"]["error"];

    if ($error > 0)
    {
        die ("Tapahtui virhe, olemme pahoillamme! Virhe koodi: $error");
    }
    else
    {
        if ($type == "file/php")

        {
            die ("Lataus ei salli tätä tiedosto muotoa $type");
        }

        else
        {
            if(move_uploaded_file($temp, "Uploads/".$name)){
            echo "Lataaminen onnistui!";
}
else {
            die("Lataaminen epäonnistui!");
}


     }
	   }
?>

-tossu- [02.01.2011 21:13:16]

#

Rickken kirjoitti:

Eli nyt on seuraavanlainen koodi ja antaa vain, että epäonnistui.

Onnistuuko lataus vaikka koodi väittää toisin? Jos lataus ei onnistu, niin sitten siian koodi toimii oikein.

Olet sanonut, ettei Uploads-tiedostoon ilmesty mitään. Luithan viestini, jossa sanoin, että Uploads:in kuuluu olla kansio. Jos Uploads on tiedosto, se selitää, miksei lataus toimi.

Antti Laaksonen [02.01.2011 21:16:34]

#

Onko muuttujissa $temp ja $name järkevää sisältöä?

Voit tulostaa ne kokeeksi esim. tässä kohtaa:

echo "temp: $temp <br> name: $name <br>";
die("Lataaminen epäonnistui!");

Onko hakemistoon Uploads riittävät kirjoitusoikeudet?

Jos ongelma ei ratkea vieläkään, voit lähettää minulle tiedostot (lähetyssivu ja tiedoston tallennus) sähköpostitse, niin yritän selvittää asiaa.

-tossu- [02.01.2011 21:27:38]

#

Tässä on Upload-koodi, joka toimii varmasti. Luo kansio "tiedostot", tallenna koodi samaan paikkaan jonne loit kansion .php-tiedostoon ja kokeile, onnistuuko lähetys.

<?php
$f = $_FILES ['tiedosto'];
if (isset ($f)) {
	if ($f ['error'] == 0 && move_uploaded_file ($f ['tmp_name'], "tiedostot/" . $f ['name']))
		echo "Lähetys onnistui!";
	else
		echo "Lähetys epäonnistui!";
}
?>
<form action="" method="post" enctype="multipart/form-data"><p>
<input type="file" name="tiedosto">
<input type="submit" value="Lähetä tiedosto"></p>
</form>

Edit: Ja kuten Anttikin sanoi, varmista oikeudet, eli *nix-palvelimella kansiolle chmod 777.

Rickken [02.01.2011 21:50:54]

#

Antti: yritin tuota, mutta ei tulostanut kumpaakaan mitään.

-tossu-: Jos oikein ymmärsin niin sitä upload.php tiedostoa ei tarvittu ollenkaan ja heitti virhettä riviltä 4 funktionista move_uploaded_file.

-tossu- [02.01.2011 21:59:17]

#

Rickken kirjoitti:

-tossu-: Jos oikein ymmärsin niin sitä upload.php tiedostoa ei tarvittu ollenkaan

Tuo lähettämäni koodi tallennettuna .php tiedostoon riittää. Lisäksi tiedoston kanssa samaan paikkaan pitää luoda tiedostot-kansio ja antaa sille riittävät oikeudet.

Rickken kirjoitti:

heitti virhettä riviltä 4 funktionista move_uploaded_file.

Kristallipallossani on hieman vikaa, joten voisitko kertoa millaisen virheen koodi antoi. Koodissa itsessään ei ole kyllä vikaa, mutta virheen syynä voi olla se, että kansiolla tiedostot ei ole tarpeeksi oikeuksia. Laitoitko sille FTP-ohjelmalla tms. kaikki oikeudet?

Hennkka [03.01.2011 09:31:53]

#

Tukeehan palvelimesi varmasti tiedostojen uppausta? Oletko kokeillut koodeja omalla koneellasi?

makumaku [03.01.2011 14:31:14]

#

Jos ajat esim phpinfo() funktion, ja sen jälkeen etsit tulosteesta kaikki "upload", niin mitä sanoo?

Rickken [03.01.2011 15:19:04]

#

-tossu-: sain toimimaan scriptisi, ymmärsin vain, että se scripti luo itse kansion "tiedostot", mutta nyt en ymmärrä miksi oma ei toimi. Oikeudet ovat 777 jokaisella tiedostolla ja niin...

Metabolix [03.01.2011 15:54:21]

#

Korjasitko omasta koodistasi tuon enctype-kirjoitusvirheen?

Rickken kirjoitti:

if ($type == "file/php")

Tuo on täysin merkityksetön tarkistus, koska kyseinen tyyppitieto on käyttäjän vapaasti muokattavissa. Oikeasti sinun pitää tarkistaa tiedoston pääte, ja varminta on hyväksyä vain tunnetut päätteet. Ei pitäisi olla mitään merkitystä, vaikka kuvatiedostoon olisi tallennettu PHP-koodia, koska jos palvelin on järkevästi säädetty, se ei aja PHP-koodia kuin .php-päätteisistä tiedostoista.

Rickken kirjoitti:

if(move_uploaded_file($temp, "Uploads/".$name))

Jos kyseessä on julkinen palvelu, on vaarallista luottaa käyttäjän antamaan nimeen, koska sitäkin voi vapaasti muokata. Vähintäänkin olisi hyvä ajaa nimi basename-funktion läpi (ja tarkistaa tiedostopääte, kuten yllä mainitsin).

Rickken [03.01.2011 19:20:38]

#

Ohhoh... Yhtäkkiä alkoi scripti toimimaan, mikähän siinä mättäsi.

Metabolix: Miten saisin sen tarkistuksen toimimaan, sallisi kuvat ja video tiedostot.
Koodi on nyt seuraavanlainen

Sivulle liitetty juttu:

<html>
<h1>Tästä lataa tiedostot palvelimelle!</h1>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="myfile"><p>
<input type="submit" value="Lataa!">


</form>
</html>

Php osa:

<?php

    $name = $_FILES["myfile"]["name"];
    $type = $_FILES["myfile"]["type"];
    $size = $_FILES["myfile"]["size"];
    $temp = $_FILES["myfile"]["tmp_name"];
    $error = $_FILES["myfile"]["error"];

    if ($error > 0)
    {
        die ("Tapahtui virhe, olemme pahoillamme! Virhe koodi: $error");
    }
    else
    {
        if ($type == "file/php")

        {
            die ("Lataus ei salli tätä tiedosto muotoa $type");
        }

        else
        {
            if(move_uploaded_file($temp, "Uploads/".$name)){
            echo "Lataaminen onnistui!";
}
else {
            die("Lataaminen epäonnistui!");
}


     }
	   }
?>

Kiitos kaikille auttajille tuhannesti!!!


Sivun alkuun

Vastaus

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

Tietoa sivustosta