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.

16 HOZZÁSZÓLÁS

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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 ;))

  6. Ü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

  7. 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! :))

  8. 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! :]

  9. Ági:

    1
    
    $filedir = dirname(__FILE__);

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

    BlackY

  10. 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

  11. 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 …

  12. 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.

  13. 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 ?

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét