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ää?
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.
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!"; } } ?>
Mutta eikös myös 19. -riviltä puutu else... ton aaltosulkeen edestä?
Pentu kirjoitti:
Mutta eikös myös 19. -riviltä puutu else... ton aaltosulkeen edestä?
Se ei vaikuta ohjelman toimintaan.
No nyt antaa tämän jutun, että ei salli tätä tiedostomuotoa vaikka kokeilin sinne vähän kaikki tiedostomuotoja. Hmmmmm...
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.
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. :)
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.
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);
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!"; } } ?>
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.
Onko tuo joku iso haitta vai jotain pieniä korjauksia vain, meinaa sitä, että uppiin pääsee vain tietyt ihmiset.
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.
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"
???
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ä.
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>
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.
Eli miten sen tekisin?
if(move_uploaded_file($temp, "Uploads/".$name)){ echo "Lataaminen onnistui!"; } else { die("Lataaminen epäonnistui!"); }
Hmm... mihin kohtaan tuo pitäisi laittaa?
Rickken kirjoitti:
Hmm... mihin kohtaan tuo pitäisi laittaa?
Move_uploaded_file-funktion eli rivin 23 tilalle.
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!"); } } } ?>
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.
Onko muuttujissa $temp ja $name järkevää sisältöä?
Voit tulostaa ne kokeeksi esim. tässä kohtaa:
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.
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.
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.
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?
Tukeehan palvelimesi varmasti tiedostojen uppausta? Oletko kokeillut koodeja omalla koneellasi?
Jos ajat esim phpinfo() funktion, ja sen jälkeen etsit tulosteesta kaikki "upload", niin mitä sanoo?
-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...
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).
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!!!
Aihe on jo aika vanha, joten et voi enää vastata siihen.