Fájlok feltöltése PHP használatával

Írta: | 2009. július 14. | kategóriák: (X)HTML, Alapok, PHP

A leírásban azt fogom bemutatni, hogy hogyan lehet elkészíteni egy egyszerű képfeltöltő rendszert PHP-ban. Először is, készítsük el az alábbi mappastruktúrát:

az “upload_files” mappa fogja tárolni a feltöltő rendszert, kód szempontjából mindegy, hogy mi a neve.
Az “uploads” mappa ad helyet a feltöltött fájljainknak, az “upload.php” pedig a rendszer motorjaként szolgál.

Az űrlap (HTML)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Fajlok feltoltese php-val</title>
</head>
<body>
<form enctype="multipart/form-data" action="" method="post" />
<input type="hidden" name="MAX_FILE_SIZE" value="3000000" /> <!--a feltöltött file maximális mérete 3mb-->
<label for="file"> Válassz egy fájlt!</label><input id="file" type="file" name="file" />
<input type="submit" name="submit" value="Feltöltés!" />
 
</body>
</html>

Így néz ki:

PHP kód

Elérkezett az izgalmas rész, mégpedig a PHP kód megírása. A következő kódot illesszük a HTML forrás elejére:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
< ?php
if(isset($_POST['submit'])) { //ha megnyomtuk a feltöltés gombot
$target= "uploads/"; //célmappa
$file_name = $_FILES['file']['name']; //a célfájlt nevezze el a $_FILES superglobal változóban lévo fájlnévre (a fájl eredeti nevére)
$tmp_dir = $_FILES['file']['tmp_name']; //az ideiglenes mappa helyét a $tmp_dir változóban tároljuk
 
if(!preg_match('/(gif|jpe?g|png)$/i', $file_name)) //ha a fájlnak ($file_name-nek) a kiterjesztése nem gif, jpg/jpeg, png, akkor...
{
echo "Rossz fajltipus!"; //... "dobjon el" egy hibát
}
else
{
move_uploaded_file($tmp_dir, $target . $file_name); //az ideiglenes mappából átteszi a fájlt a végleges mappába (a $target . $file_name összeilleszti a két stringet, így uploads/fajlnev-et kapunk)
$feltoltve = true; //a feltoltve változó true értéket kap
}
}
?>

Ahogy látható, lekorlátozzuk a feltölthető fájlokat képekre (gif-re, jpg/jpeg-re, png-re) a preg_match-et használva, tehát ha a fájl végén nem gif, jp(e)g vagy png van, akkor Rossz fájltípusra hivatkozva
meghíusul a feltöltés.

Most pedig vissza kell jeleznünk valamit a felhasználónak, tehát:

1
2
3
4
5
6
< ?php
if($feltoltve) {
$utvonal = $target . $file_name;
echo "Sikeresen feltöltötted a képet, megnézheted <a href="$utvonal">itt< /a>!";
}
?>

A végeredmény, ha a fájlt sikerült feltölteni:

A kód letöltése.



Értékeld a bejegyzést!

Loading ... Loading ...

A bejegyzésre érkező kommenteket elérheted RSS 2.0 formájában vagy emailben is:

A bejegyzéshez tartozó trackback cím, illetve a permalink.

A megjegyzéseket kérlek, tedd fel érthető és illendő módon, ne fikázz le másokat, mert nem tudnak valamit, amit te már igen. A kommentár lehetőleg függjön a bejegyzéshez :)

kötelező
kötelező, titok marad
ha nincs, maradjon üres



Mi van akkor, ha pl. egy php file-nak adok .jpg kiterjesztést?

tracert 2009. július 15. - 09:58

mivel csak a kiterjesztést nézi, ezért fel lehet tölteni, viszont nem fog lefutni, mert jpg kiterjesztése van, előnézetnél pedig semmit nem fogsz látni.

lowert 2009. július 15. - 13:49

mármint a PHP kódot, amit feltöltesz, az nem fog lefutni

lowert 2009. július 15. - 21:22

Valóban, ez nem jutott eszembe. Köszi!:)

tracert 2009. július 15. - 22:49

szívesen :)

lowert 2009. július 15. - 23:22

A biztos védelem érdeklében ilyen esetben szokták mondani, hogy a GD modul segítségével meg kell próbálni betölteni a képet. Ha hibát dob, akkor nem kép, hanem egy tetszőleges mime típusú átnevezett fájl.

Max Logan 2009. július 31. - 15:07

persze, még millió féleképpen lehet növelni a biztonságot, ez csak egy alap szintű leírásnak lett szánva :)

lowert 2009. július 31. - 21:58

Pofás és érthető leírás. Ki is próbálom. Köszi!

Milhó 2009. augusztus 3. - 13:46

Szivesen ;)

Avatar Tupacko
2009. augusztus 3.
15:23

Szia! A php kód 4. sora nem teljesen érthető számomra, el tudnád mondani, hogy mit kezdjek vele. Pontosan melyik részét kell átírni és mit írjak a helyére. Előre is köszönöm a választ.

50cent 2009. augusztus 10. - 19:16

Nem kell kicserelni semmit. Amikor feltoltesz egy filet, az eredetileg egy temporalis file lesz egy “zagyva” nevvel. A negyedik sor kinyeri azt a nevet, ami a file neve volt a szamitogepeden (amit feltoltottel). Ezt a nevet fogja hasznalni a kesobbi kodreszlet, hogy a temporalis filet atmasolja egy allando fileba a megadott nevvel.

Avatar Tupacko
2009. augusztus 10.
20:13

Hol tudnék feltölteni PSD fájlt?
Ha valaki tudja akkor erre az e-mail cmire küldje:mucuska90@citromail.hu

Csedő Zsanett 2009. október 27. - 16:27

Ugyan igy tudsz feltolteni, csak ne szurd a feltoltott allomanyok kiterjeszteset, gif, jpeg, jpg es png-re. Vagy add hozza a PSDt is, vagy ne nezd a kiterjesztest …

Avatar Tupacko
2009. október 27.
17:31

tör 2009. december 23. - 15:54

Szia!

Remélem tudsz segíteni!

Az egyik oldalba a megfelelő helyre beraktam a html kódot, majd létrehoztam az uploader.php nevű fájlt, és az uploads nevű mappát. Mindet feltöltöttem az oldalhoz.
Tallózok, és feltöltés, de ekkor ezt írja ki:
“The requested method POST is not allowed for the URL /feltolt.html”

mit tudnék tenni, hogy rendesen működjön??? Az egész oldalt htmlben szerkesztem, és php-t most használok először…….:S:S:S

Remélem valakinek lesz egy hasznos hozzászólása!!!!!!!!

Schilla 2010. április 19. - 19:57

Szia!
Próbáld meg úgy, hogy feltolt.html-t átnevezed feltolt.php-ra ;)
Remélem, mondanom sem kell, hogy ezt fel kell töltened egy szerverre, hogy lefusson.

lowert 2010. április 19. - 19:59

Az is lehet, hogy a szerver, amire fel van teve a weboldalad, nem tamogatja a POST kerest. Bar ketlem. Tobb, mint valoszinu, hogy a file kiterjesztese a gond (kiterjesztes szinten lehet filterezni, hogy mi milyen meghivasokra feleljen).

Avatar Tupacko
2010. április 19.
20:48

A feltolt.html az a htmé oldal amiben a feltöltés van…. ahol el tudják érni a feltöltést…. miért cserélném ki feltolt.php-ra ha ilyen fájlom nincs is?

A tárhely nem ingyenes, és én nem állítottam be semmilyen szűrést!!

Hogyan lehet filterezni?

Schilla 2010. április 21. - 10:57

Félreértettél :)
Nem kell kicserélned, hanem át kell nevezned. Magyarul megnyitsz egy fájlkezelő programot (például Windows Intéző, Total Commander, Mac Finder stb). A feltolt.html fájlon jobb gombbal kattintasz, így megjelenik a legördülő menü. Kiválasztod az Átnevezés/Rename opciót, majd a feltolt.html-t átírod feltolt.php-ra. Azért nem működik a dolog nálad, mert a feltolt.html egy html file, amin belül nem lehet php kódokat futtatni (mint amilyen ez a feltöltő kód is), a megoldás: php file-ként kell elmenteni a dokumentumot. A php fileok nagyban hasonlítanak a HTML fileokhoz, tehát akármilyen HTML kódot beírhatsz egy .php file-ba, az ugyanúgy fog működni, viszont itt használhatod a php nyelven írt programokat is, mint például ezt a feltöltőt. Arra figyelj, hogy miután átnevezted, az összes olyan oldalban lévő linket át kell írnod, ami az eredeti feltolt.html-re hivatkozik, mostmár a feltolt.php-ra kell, hogy hivatkozzon.

lowert 2010. április 21. - 11:05

Rosszul jeleníti meg, azt írtam, hogy

Szia

A legvégén az “itt!” után hiányzik a lezáró

Dénes 2010. május 26. - 14:38

Koszi! Javitom!

Avatar Tupacko
2010. május 26.
15:09

Nekem nem működök a feltöltés meg nem is nagyon értem h mit hova és mi elé kell illesztenem.

Teljesen kezdőnek aki nulla tudással rendelkezik az hogy tudná megcsinálni??

Arra szeretném használni h a valami.fw.hu – n osztálytársaim feltudjanak nekem tölteni képet és akár fájlokat is.

Ha valaki tömörítve elküldené nekem h csak fel kelljen másolnop az ftp-re és utána működne azt nagyon megköszönném:$ én nem tanultam soha ilyet még infóbol sem sem:( sajnos nem is értek hozzá. Úgy gondoltuk ez egyszerübb lenne(ha megtudtam volna csinálni)

Köszönöm és elnézést h ilyen bután kérdezek nálam jóval okosabbaktól erről a témában:(
email címem ha valaki elküldni nekem:$: laki_@freemail.hu

laki 2010. szeptember 21. - 17:43

Attol tartok, hogy sok keretlen file kerulne feltoltesre, ha semmi biztonsagi reteg nincs beleteve. Ha valoban nem tanultal ilyeneket es nem vagy temaban, akkor valoszinu jobb, ha a file feltoltest nem erolteted, mert sok virust beszippanthat a rendszered es lehet, hogy az tarhelyszolgaltato sem engedi a veletlenszeru filefeltolteseket.

Avatar Tupacko
2010. szeptember 21.
19:14

Hali
értelmesnek tűnik a dolog lehet én vok hülye:D
van egykét dolog amit nem értek…
át kéne írnom valamit?
csak mert ha rámegyek hogy feltöltés akkor elkezd tölteni és ki is írja hogy sikeresen feltöltötted, de mégsincs feltöltve semmi
két dolog amit nem is értek benne:
egyik: az ideiglenes mappa helyét a $tmp_dir változóban tároljuk
másik: az ideiglenes mappából átteszi a fájlt a végleges mappába (a $target . $file_name összeilleszti a két stringet, így uploads/fajlnev-et kapunk)
Nemlehet megcsinálni hogy egyböl betegye az uploads mappába? mert aztirja h ideiglenesen… valami:D
valaki segitsen a kezdöknek:)
elöre is köszi

Én 2010. október 21. - 20:05

Szia Te!

A PHP alapbol a szerver egy tarolojaba tolti fel a kivalasztott allomanyt egy egyedi nevvel (nem azzal, amit te latsz, amikor kivalasztod). Abbol az ideiglenes formabol a move_uploaded_file fugvennyel tudod a vegleges helyere vinni.
Letrehoztad a szukseges (leirt) konyvtarszerkezetet?

Avatar Tupacko
2010. október 21.
21:33

Heló
gyorsan jött a válasz:)
a könyvtárszerkezet alapból megvolt, mert a kód letöltésére mentem, és ott alapból megvolt az is, azon semmit sem változtattam csak simán feltöltöttem
várom a megoldást, elöre is köszi

Megint Én 2010. október 22. - 09:48

Ha ingyenes tarhelyen vagy, akkor nem biztos, hogy engedelyezve van a file feltoltese. Ha fizetos helyen vagy, akkor is megkell gyozodj rola, hogy van jogod filet feltolteni PHPbol.

Avatar Tupacko
2010. október 22.
20:16

Igen, peldaul en megneztem 000webhoston, naluk nem lehet feltotleni, de a szunyi-nal peldaul igen. Ha nincs ez engedelyezve, akkor semmilyen hibauzenetet nem ir ki… Te melyik tarhelynel vagy? (remelem tudod, hogy a PHP kodot csak a PHP-val rendelkezo gepek, altalaban szerverek tudjak lefutattni…)

Csongor 2010. október 22. - 21:54

atw-n vok… ott engedi?

Én 2010. október 23. - 16:55

ezt írják az atw oldalán: A munkamenet fájlokat a PHP minden esetben a gyökérkönyvtárad alatti ‘tmp’ könyvtárban tárolja, ezért nincs más dolgod, mint létrehozni azt.
Ez pontosan mit is jelent?

Én 2010. október 23. - 16:59

ááá…XD
sikerültXD
annyi lett volna, hogy amit letöltöttem mappaszerkezetet, azt még bele kellett tennem egy “tmp” nevű mappába:D szerintem ennek nemsok értelme van, deh a lényeg h megvan, ami nélkületek nem sikerült volna, mert nem jutott volna eszembe felmenni az atw oldalára és megnézni h mi a baja
szóval köszi szépen srácok… örök hála:)

Én 2010. október 23. - 18:16

Nincs amit! Nincs is annal szebb es jobb, mint ha magad talalod meg a vegso megoldast :)

Gratulalok!

Avatar Tupacko
2010. október 23.
22:38

Csongor:

00webhoston lehet feltölteni :D nekem is van ott tárhelyem és tökéletesen feltölt képeket vagy egyebeket, sőt még a GD-t is lehet használni…

Pl: http://lsdpictures.tk

Leoamros 2010. november 5. - 13:08

Nekem ezt irja:
Notice: Undefined variable: feltoltve in C:\wamp\www\upload_files\upload.php on line 39.
Aki ugyanezt tapasztalja, tegyen egy @ -ot ide:
if(@$feltoltve) {

:)
Amugy jól müködik, köszönöm!

Dema 2011. március 18. - 17:48

A megoldas nem az, hogy beirsz egy @-ot, mivel az csak annyit tesz, hogy megakadalyozza a hibauzenet kiirasat.

A megoldas, hogy definiald a $feltoltve-t false-ra, meg a feltoltes kezdete elott, ahol a $target is definialva van.

Koszonom a figyelem-felhivast!

Avatar Tupacko
2011. március 18.
18:58

Letudná írni egybe mert nem tudom hogy melyik az eleje meg a vége

Laci 2011. március 31. - 17:50

Ja megvan de így nem fogadja el rossz így:

Fajlok feltoltese php-val

Válassz egy fájlt!

< ?php
if($feltoltve) {
$utvonal = $target . $file_name;
echo "Sikeresen feltöltötted a képet, megnézheted itt!”;
}
?>

Laci 2011. március 31. - 18:05

Tupacko arra gondolt, hogy keresd meg ezt a sort:
$target = “uploads/” // célmappa
és alatta hozd létre a feltoltve változót, adj neki egy alap értéket.
$feltoltve = false;
Mit nem fogad el? Van hiba üzenet?

Tas 2011. április 7. - 14:24

Sziasztok!

Kb két hete küszködök már ezzel… ATW weboldalán valamiért nem megy a file feltöltés, hibaüzi nincs, mert azt mondja hogy sikeresen feltöltöttem, még meg is nézhetném, de ekkor jön egy 404-es hibakód…


Válassz egy fájlt!

<?php
if($feltoltve) {
$utvonal = $target . $file_name;
echo "Sikeresen feltöltötted a képet megnézheted <a href=’$utvonal’ rel=”nofollow”>itt</a>!”;
}
?>

ha valaki megtudja nekem mondani hogy ez miért nem jó, annak nagyon hálás lennék.

Köszönöm.

Gábor 2011. július 18. - 15:36

Nincs valami korlatozas ATW-nel, file feltoltes szempontjabol? Hibakiiratas be van kapcsolva?

Keress ra az ATW foruman, ha esetleg masnak is volt gondja a file feltoltessel. A script elvileg nem hibas, de a szerver jogosultsagai is kozre jatszhatnak.

Probalj meg felolteni egyszer egy kicsi szoveges allomanyt. Ha az megy, akkor vagy nem enged bizonyos tipusu allomanyt felolteni vagy van feltoltesi korlat.

Avatar Tupacko
2011. július 18.
20:51

Lehet olyat csinálni, hogy mindjárt be is illessze a feltöltött képet az oldalra?

András 2011. november 6. - 11:12

Persze, az elmentett kep URL-jet beirod egy img tag src mezojebe, mintha csak barmi egyeb kepet illesztnel az oldalba.

Avatar Tupacko
2011. november 6.
17:29

Jó leírás, segített!

varh1i 2012. január 14. - 10:27

Örülök :)

Avatar Tupacko
2012. január 14.
13:06