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

Írta: lowert | 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