Egyszerű fájlfeltöltés PHP-vel


A HTTP specifikáció szerint a kliens feltölthet tetszőleges fileokat a szerverre, viszont ezt egy szerver-oldali programmal – jelen esetben egy php szkript – fel kell dolgozni. Ez a kis leírás erre a feldolgozásra ad példát.

Ezt a szkriptet a fórum PHP-s probléma… című témájában írtuk össze, és Jhonnyb szerint megérdemli, hogy leírás készüljön belőle.

A lényege, hogy tetszőleges fájlt fel lehessen tölteni a szerverre FTP-zés nékül.

Mivel a szkript nem végez semmiféle ellenőrzést a fileon, ezért SOHA ne tegyük ilyen formában a fájltfeltöltést elérhetővé felhasználóink számára!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?PHP
$filedir = 'uploads'; 
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) 
    { 
    if(!file_exists($filedir . '/' . basename($_FILES['userfile']['name']))) 
        { 
        if(move_uploaded_file($_FILES['userfile']['tmp_name'],$filedir . '/'.basename($_FILES['userfile']['name']))); 
            { 
            print "A file feltöltése sikerült!"; 
            } 
        } 
    else 
        { 
        print "A file már létezett!"; 
        } 
    } 
?> 
 
<form enctype="multipart/form-data" action="<?=$_SERVER['SCRIPT_NAME'];?>" method="post"> 
<input type="hidden" name="MAX_FILE_SIZE" value="2000000"> 
<input type="file" name="userfile"> 
<input type="submit" value="Upload!"> 
</form>

Ez a kis szkript annyit csinál, hogy megjelenít egy form-ot, ami az adott filenévre hivatkozva (action paraméter) lehetővé teszi egy file feltöltését, amit szerveroldalon elment a program, ha még nincs adott nevű file a $filedir változóban megadott könyvtárban…

A PHP-vel való fájlfeltöltésről további információkat és példákat itt találhatunk.

Kapcsolódó bejegyzések:
  • A PHP-val való publikus fájlfeltöltésnél a biztonságra ügyelni kell. Vannak olyan gyakran használt ellenőrző módszerek, amik nem állják meg a helyüket, de egysze …

  • Elsőnek készítsünk egy form-ot: A check.php-ben vegyünk fel egy változót:$pass = $_POST[“pass”]; Majd egy if feltétellel vizsgálju …

  • A paraméter átadásnak egyszerű html-ből 3 ismert módja a sütik, a GET és a POST. Mind a 3 megoldásnak megvannak az előnyei és hátrányai. Nézzük sorra.SÜTIK …

  • Van egy régebbi tutorial (“Tartalom váltása a lap újratöltése nélkül II. – HTMLHttpRequest”), amit szerettem volna használni egy adminisztrációs felületen. Remek …

  • Felmerült egy kérdésként, hogy lehetne egy login oldal tartalmánál (belépési név és jelszót kell megadni) jelezni a felhasználók számára azt, hogy melyik mező mi …

A cikket beküldte: BlackY ()

16 hozzászólás

  1. Zsolti says:

    Hello, légyszi tegyél fel olyat is, ami leellenőrzi… köszi

  2. BlackY says:

    Szia!

    Általános célút nem lehet írni, mert attól függően, hogy milyen típusú dolgokat lehet feltöteni más-más ellenőrzés kell. (Esetleg mime-típus ellenőrzés, de a php vonatkozó függvénye (mime_content_type) elavult (deprecated), és csak azért PEAR osztályokat használni lézerágyúval verébre eset)
    De pl.: ha képet vársz, és nem számítasz túl sok látogatóra, akkor a mentés után érdemes átküldeni a getImageSize függvényen, ha nem tömböt kapsz vissza, akkor nem kép, így nem kell menteni. (azaz törölni kell, mert ahhoz, hogy átnézhesd menteni kell egy olyan helyre, amit biztosan elérhet a kódod)

    BlackY

  3. Atman says:

    Szia!

    Van ezzel egy kicsi problémám! Olyan bug-osnak tűnő dolog.
    Minden működik, ha csak a feltöltő form és a fájl kezelő dolgok vannak a skriptben.
    Viszont én a form-ot feltételhez kötötten akarom kitenni az oldalra. 3 if alatt illetve egyéb elágazások esetében is azt tapasztaltam hogy a “userfile” változó nem a megfelelő értéket hordozza. Sajnos nem tudom jobban elmagyarázni, mert nem ismerem olyan mélyen a php-t.
    Azt tapasztalom, hogy a $userfile változóban nem az ideiglenesen elhelyezett fájl található, hanem az eredeti fájlnak csupán a neve a hozzá tartozó útvonal nélkül. A $userfile[“name”], $userfile[“type”], $userfile[“tmp_name”] változók értékei, pedig rendre az eredeti fájl kezdőbetűje. Ha tudnád erre a válasz az nagyon jó lenne. Random elhelyezve a scriptben a formot néhány helyen működik, a többi helyen viszont nem.

    Atman

  4. Atman says:

    Sziasztok!

    Igaz kb. 1,5 napot szenvedtem vele, de meglett a “bug”-om. :-) Mint a legtöbb esetben itt is elírás volt a hiba oka. Egy megelőző zárótag elírása volt mindennek oka. Ha valaki hasonló cipőben járna legalább ezáltal tudni fogja hol keresse a hibát!

    Atman

  5. Medve says:

    Hali!

    Nekem az a gondom, hogy fájlfeltöltésnél 6os értéket dob ki a $_FILES[error] -ra. Ami a php.neten azt jelenti hogy a TMP mappa hiányzik…
    Ezt hogy tudom beállitani? Gondolom a php.ini-be kellene… de ez az ftp-n nincs :S
    Help pls

  6. Nida says:

    Medve:

    Bár ahogy látom, kissé idejét múlta a válasz, de azért leírom:

    Egyszerűen hozz létre az ftp szerveren egy TMP könyvtárat :D
    Szerintem hatásos lesz ;))

  7. sfhawke says:

    Üdv!
    Sajna úgy veszem észre hogy a php nem is programozási nyelv. (Én jópár nyelven túl vagyok az automatizálásban, de ilyen fost még nem láttam)
    A legegyszerűbb példát bemsoltam copy paste-tel első körben, gondoltam ebben hiba nem lehet. Természetesen mint az eddigi leírásokban, ebben sem működött, és lehet szopni vele hogy az adott környezetben épp mit kell másképp írni. Ezt nem nevezném nyelvnek.(Feltételezem hogy a cikk közlője ért hozzá és nem hülyeséget tett be.)
    Őszinte részvétem fiók hogy van türelmetek ilyen megfoghatalan híg fossal foglakozni.
    H

  8. suexID says:

    sfhawke: őszinte gratulációm, hogy ezzel a dilettáns hozzáállással sikerült kijutnod a szülőszobából egyáltalán. Komolyan, ez egy elismerésre méltó teljesítmény! :))

  9. ági says:

    Hello!
    Következő a kérdésem: megoldható, hogy a fájlokat ne egy mappába, hanem egyszerűen az oldal fő könyvtárába töltse fel? ha igen, hogy kell megadnom az elérési utat? bocsi, ha hülyeséget kérdeztem, de csak most kezdek ismerkedni a phpvel.
    egyébként köszi a szkriptet, egy nagy problémámat sikerült megoldani a segítségével! :]

  10. BlackY says:

    Ági:

    1
    
    $filedir = dirname(__FILE__);

    Feltéve, hogy a feltöltést kezelő fájlod a fő könyvtárban van.

    BlackY

  11. BlackY says:

    Egy hibaüzenet még jól jönne, nálam működik úgy, ahogy írtam.
    A __FILE__ (két alsó vonal van előtte és utána is!) egy ún. mágikus konstans, mindig annak a fájlnak a teljes elérési útját tartalmazza, amiben éppen hivatkozol rá. Tehát betűről betűre úgy kell, ahogy fentebb írtam :)

    BlackY

  12. ági says:

    köszi a választ! most azt írja, hogy a 14. sorban hiba van. ez a következő:
    if(move_uploaded_file($_FILES[‘userfile’][‘tmp_name’],$filedir . ‘/’.basename($_FILES[‘userfile’][‘name’])));
    gondolom a / jellel van a gond, de ha kitörlöm akkor se jó. egyébként a _FILE_ helyére kell beírnom valamit, vagy ez így már kész? bocsi az értetlenkedésért …

  13. codee47 says:

    Köszi, frankón működik!

  14. Dávid says:

    Hello mindenki!
    csináltam egy képfeltöltő oldalt, amiben az itt leírt módon feltölthetünk képeket. azok adatai bekerülnek egy mysql adatbázisba, majd ezek alapján kirajzolódnak a képek egy táblázatban. a képeket törölni is lehet az unlink() függvény használatával. A helyzet az, hogy a gépemben wamp szerveren minden tökéletesen működik, azonban mikor feltöltöttem egy internetes szerverre az oldalt, akkor ott már nem megy a fájlfeltöltés sem a törlés. az adatbázisos cucc működik. tárolódnak benne a kiválasztott kép adatai. Az if (is_uploaded_file($_FILES[‘userfile’][‘tmp_name’])) feltétel teljesül. leellenőriztem kiiratással. TMP könyvtárat is csináltam. Fogalmam sincs, hogy mi lehet a gond. FTP-vel simán megy a fájlfeltöltés. tudna vki vmi hasznos tanácsot adni? Mi lehet a gond? kipróbáltam már mindent, egyszerűen nem tudok rájönni.

  15. gyuri says:

    htaccess -be nincs letiltva a fájl feltöltés mappa hozzáférés ? A mappának 777 jog van állítva a serveren ?

  16. Dávid says:

    igen, már megoldottam. pontosan ez volt a gond. azért köszi

Szólj hozzá
a Egyszerű fájlfeltöltés PHP-vel c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>