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



Hali!
Esetleg valami folyamat jelzővel ki lehetne valahogyan egészíteni? Mert nagy méretű file-ok esetén, jó lenne, ha adna valami visszajelzést, hogy hol tart a feltöltés.
Köszi!

Üdv.

maLLoud 2012. július 4. - 08:57

Szia!

Folyamatjelzos megoldast csak ott lehet, ahol tamogatja a bongeszo es a szerver is. AJAX alapon egy pelda:

http://valums.com/ajax-upload/

Avatar Tupacko
2012. július 4.
09:22

Uha. Ez már nagyon messze van tőlem. Esetleg tudnál adni egy leírást, hogy merre induljak el Ajax ügyben? Konkétabban, hogyan lehet ezt beilleszteni egy weboldal felületébe, és mi kell ahhoz, hogy szerver ajax támogatással bírjon. Ezt a plugint kell nekem még szerkesztenem valamennyire, vagy ez használható is egyből, csak be kell ileszteni? Ahogy gyorsan utánnaolvastam, kell egy keretrendszer a szerkesztéséhez.

maLLoud 2012. július 4. - 09:38

Minden, amire szukseged van, a plug-inhez tartozo leirasban van. Teljesen fuggetlen a fentebb talalhato egyszeru PHP feltoltotol. A peldat kovetve egybol beillesztheto a weboldaladba.

Sok sikert 🙂

Avatar Tupacko
2012. július 4.
09:52

Köszi! 😀 Mondjuk még csak információt gyűjtök. Amúgy még csak most rakom össze a szervert.

maLLoud 2012. július 4. - 10:21

Nincs amit, szivesen. Jo szorakozast! 🙂

Avatar Tupacko
2012. július 4.
11:07

Halló!
hol ellenőrzi a méretét?
üdv.

Fmark999 2012. július 23. - 19:22

Elintezi azt a PHP, a programozo nem kell ezzel foglalkozzon (csak ha nagyon szkeptikus es fel, hogy megvaltoztatja valaki azt, pl. firebuggal).

Avatar Tupacko
2012. július 23.
19:35

helo.
Nekem nemjo megnyitom a php t a böngészőbe és ki irja azt a kodot ami benne van a php fáljban

Krisztián 2013. február 22. - 14:47

A szerveren be kell legyen allitva a PHP allomanyok kezelese. Egyeztetni kell a szolgaltatoval.

Avatar Tupacko
2013. február 24.
22:10

Üdv,

Szép és áttekinthető leírás.
Kérdésem lenne. Megoldható az valahogy, hogy a feltöltött képet máshol megjelenítsük?
Konkrétan egy hirdető weboldalra gondoltam, ahol valaki feltölt valamit, és az meg is jelenjen…
Webshop szerű dolog lenne ez…

Előre is köszi a választ!

Dávid 2013. április 7. - 22:10

Szia!

Termeszetesen megoldhato. A kiirashoz egy hagyomanyos img tag src attributumaba be kell ekelni a dinamikusan feltoltott allomany nevet, pl. src=”eleresi/utvonal/” + $uploadedFile

Eppen arra kell figyelni, hogy mindenkeppen ellenorizd, hogy kep legyen a feltoltott allomany MIME leirasa, nehogy feltorjek az oldalad.

Esetleg nezd meg, hogy van megoldva egy WordPressben vagy hasonlo nyilt forraskodu rendszerekben.

Avatar Tupacko
2013. április 8.
08:00

Hali! Letöltöttem ezt a kis kiegészítést. ATW.hu tárhelyen vagyok most. Ha simán feltöltöm az FTP-re majd urlből bepötyögöm oldalam.akár.stb/upload.. akkor szépen bejön és fel is tudok tölteni, nagyon jó.
Nekem viszont lenne egy file.php-m, amibe ezt bele akarom tenni egy űrlapom van. Sajnos hiába próbálkozok vele nem akar összejöni. Bele bele teszi látom ott van de amikor a feltöltésre megyek akkor nuku semmi, nem tölt fel semmit. Hogy lehet ezt orvosolni ?

user01 2013. május 4. - 07:25

Az upload.php onmagaban mar egy urlap. Ha file.php-nak akarod nevezni, akkor csak at kell ird az allomany nevet. Ha mar van egy letezo file.php es abba szeretned belerakni a feltolteshez szukseges logikat, akkor a form enctype=”multipart/form-data” reszet kell atvidd a masik allomanyba is es a mezoket, illetve a PHP kodot, a feldolgozashoz.

Sok sikert 🙂

Avatar Tupacko
2013. május 7.
08:50

A kétkedőknek: a 000webhoston teljesen jól működik a fájlfeltöltés, a fentebb írt php kóddal is!

JolietJake 2013. június 14. - 19:13

Üdv, szép kis leírás, teljesen érthető. Egy megoldásra tanácsot szeretnék kérni. Van egy üres adatbázis. Készítettem egy “űrlapot” ahol képet is kell feltölteni. Namost ha valaki rámegy a “submit”-ra akkor feltöltődik minden kitöltött adat
az adatbázisba(kap egy VKOD-ot ami egy számláló) és ez a VKOD alapján nevezzel el a képet abba a mappába ahova feltölttötte. Ha van valamilyen tipped , megköszönöm!?^^

Máté 2013. június 22. - 15:53

A $file_name változót állítsd be a kívánt névre. Pl. $file_name = ‘kep-‘ + $vkod;

Avatar Tupacko
2013. június 25.
19:53

Sziasztok!

Freewebes honlapra szeretném megcsinálni ezt a képfeltöltést de nem sikerül itt is van tmp mappa meg web mappa a web mappába kell berakni az oldalakat ugye arra már rájöttem hogy a tárheynél elő kellett fizetnem h engedélyezve legyen a php és azt mostmár meg is nyitja meg a feltöltés gomb is működik csak éppen nem tölti fel a képeket hiába teszem bele a tmp mappába a mappaösszeállítást hozzászólásba olvastam h valakinek sikerült atwn ahol szintén ilyen tmp mappa is van…Tudtok ebbe segíteni hogy amit letöltök mappaszerkezetet az hova rakjam vagy h a php ba kell e vmit átírni vagy hogy működhetne? nekem olyan megoldás is jó lenne h ha e-mailbe küldené el nekem a képet ha az egyszerűbb nemtudom kezdő vagyok még! 😀 Köszi előre is!

AdamS 2013. szeptember 4. - 18:36

Ha a PHP lefut, akkor azt kell megnezni, hogy az allomany ne legyen nagyobb, mint a megengedett legnagyobb feltoltheto meret. Regen volt valami nagyon alacsony korlat, 20KB talan …

Tovabba, ellenorizni kell, hogy a konyvtar ahova irni szeretnel, a filet feltolteni, rendelkezik-e irasi joggal.

Ha semmi gondot nem eszlelsz, de nem mukodik, akkor meg kell kerdezni a FreeWeb-tol, hogy mi lehet, mit ir az errorlog.

Avatar Tupacko
2013. szeptember 4.
19:32

Szia. nagyon köszi, viszont az lenne a kérdésem hogyha én szeretném azt megcsinálni hogy a feltöltött kép fájlneve a feltöltéskor megvátozzon, méghozzá a feltöltő regisztrál felhazsnálónevére. egy wordpresses oldalba szeretném beépíteni. tehát ha a regisztrált felhasználó neve “jozsi123” akkor a feltöltött fájlt “Jozsi123.png”-re nevezze át.
Tudnál erre egy megoldást nekem, nagy segítség lenne 🙂
Köszi, üdv: Rob

Rob Durann 2013. szeptember 21. - 03:56

Ha avatarként lenne használva a felhasználó nevére keresztelt állomány, akkor inkább ajánlom a Gravatar vagy hasonló szolgáltatást. A WordPress-be alapból be is van építve és a felhasználót az email címe alapján azonosítja.

A megoldás különben az, hogy amikor meghívod a move_uploaded_file függvényt, akkor az állománynévhez (file_name) a felhasználó nevét adod meg. !!! Figyelj az ékezetekre !!!

Avatar Tupacko
2013. szeptember 21.
11:33

nem megy 🙁 Szerver hibát ír ki mindig. Fontos hogy arra a névre nevezze át amivel a felhasználó regisztrált, tehát a felhasználónevére. Nem avatar miatt, hanem egy külső alkalmazáshoz kellenek a képek. mert a külső alkalmazás úgy köti a felhasználóhoz a képet hogy a feltöltött képek útvonaláról olvassa be. tehát weboldal/uploads/%username.png

Rob Durann 2013. szeptember 25. - 02:47

Üdv! Teljesen jól működik a kód köszönöm. Az lenne a kérdésem, hogy mit kéne alakítani rajt több fájl feltöltéséhez? Mert ezzel egyszerre csak 1 darabot enged feltölteni.

Ádám 2013. november 21. - 16:43

Rob, probald meg egyszeru felhasznalonevvel, pl. lila. Tovabbra sem ajanlom direkt a felhasznaloi nevre menteni az allomanyt, mivel az tartalmazhat specialis karaktereket, ami nem a legjobb fileok eseteben. Akkor mar inkabb legyen a felhasznaloi fiokhoz kotott egyedi azonosito, pl. a felhasznalonev MD5 hash base64 formajanak elso X karaktere, ahol X = 32 – a felhasznalo adatbazisbeli ID-janak hossza. Peldaul ha az ID = 253, akkor 29 karakter a base64-bol + 253 a vegen.

Igy elkerulod azt a problemat, hogy a felhasznalonev specialis karaktert tartalmaz vagy hogy lathatoan kiteszed a felhasznalo nevet.

Tovabbi lehetosegek is vannak, a lenyeg hogy legyen “egyszeru” a kep neve a szamitogep szamara, illetve legyen semmit mondo egy kulso fel szamara.

Avatar Tupacko
2013. november 24.
16:46

Adam, a HTML reszben tobb file input kell, a nevuket (name) pedig generalhatod, pl. file1, file2, file3, stb. ahol a szam egy index. A PHP kodban pedig egy foreach-el feltudod dolgozni, a mostani kod minimalis valtoztatasaval: a 4. sortol mehet foreach-be, a $_FILES[‘file’] helyett meg a $_FILES[‘file1’], file2, … stb. kell.

Avatar Tupacko
2013. november 24.
16:50

Sziasztok!

Nagyon jó a leírás de én béna vagyok hozzá.
Szeretnék egy nagyon egyszerű oldalt. Annyi lenne az egész, hogy egy képfeltöltés és a feltöltött kép jelenjen meg közvetlenül alatta. Megoldható ez? Tud benne valaki segíteni?? Előre is köszi

fertib 2014. október 26. - 13:50

A lényeg az, hogy tanulj meg valamit, maradj kézzelfogható tudással. Az, ha valaki ezt megoldja neked pár perc alatt, nem fog segíteni neked (sőt ártani fog) hosszú távon. A leírás és a kommentek alapján biztosan megtudod oldani! Bízunk benned 🙂

Avatar Tupacko
2014. október 28.
18:29

Próbáltam a leirtakat. A könyvtár s. megtartva . Az upload.php inkludoltam ,de nem működik.

niagara59 2015. november 21. - 16:38

Valamelyik lépés kimaradhatott, sokmindenki használta már az eredeti megjelenése óta. Kérlek nézd át, biztosan megtalálod mi maradhatott ki 🙂

Avatar Tupacko
2015. november 22.
14:52

Hali! Tökéletesen működő script, köszi! ez egy alap cucc, én még fejlesztgetek rajta, de kiindulásnak kiváló! Nagyon köszi érte!

MorpheusMP 2017. január 22. - 11:22