Kihagyás

9.2. fejezet

A fejezet anyaga

Fájlfeltöltés

A PHP segítségével egyszerűen tölthetünk fel különféle fájlokat a szerverre egy űrlapról.

A fájlfeltöltésre alkalmas HTML űrlap

Ha azt szeretnénk, hogy egy HTML űrlapon lehetőség legyen fájlok feltöltésére, akkor az alábbi 3 feltételnek kell teljesülnie a HTML kódra vonatkozóan:

  • a <form> tag a method="POST" attribútummal kell, hogy ellátva legyen
  • a <form> tagnek rendelkeznie kell egy enctype="multipart/form-data" attribútummal
  • az űrlapon el kell helyezni egy <input type="file"/> elemet a fájlfeltöltésre.

Az <input type="file"/> űrlapelem accept attribútumával megadhatjuk a feltölteni kívánt fájl elvárt kiterjesztését. Ekkor a fájlok tallózására szolgáló dialógusablakban a felhasználó csak a megadott kiterjesztésű állományokat látja. Ez inkább egy kényelmi funkció, és nem egy megbízható validálási eszköz. A fájl kiterjesztését szerveroldalon is ellenőrizni kell!

Példa: Egy HTML űrlap, fájlfeltöltéssel

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="hu">
  <head>
    <title>Fájlfeltöltés</title>
    <meta charset="UTF-8"/>
    <style>
      input { margin-bottom: 10px; }
    </style>
  </head>
  <body>
    <form action="process.php" method="POST" enctype="multipart/form-data">
      <label for="file-upload">Profilkép:</label>
      <!-- Csak képfájlokat szeretnénk engedélyezni a feltöltés során -->
      <input type="file" id="file-upload" name="profile-pic" accept="image/*"/> <br/>
      <input type="submit" name="upload-btn" value="Feltöltés"/>
    </form>
  </body>
</html>

A feltöltött fájlok adatainak elérése PHP-ban

PHP-ban a feltöltött fájlok adatait a $_FILES szuperglobális tömb tartalmazza. Ennek az elemei a feltöltött fájlok adatait tartalmazó asszociatív tömbök, amelyek a következő kulcsokkal rendelkeznek:

  • name: a feltöltött fájl neve
  • tmp_name: ideiglenes név, amivel a fájl feltöltésre kerül (az elérési útvonalat is tartalmazza)
  • size: a feltöltött fájl mérete (bájtokban)
  • type: a feltöltött fájl típusa
  • error: hibakód (0, ha nem történt hiba a fájlfeltöltés során).

Példa: Egy feltöltött fájl adatainak kiíratása PHP-ban

1
2
3
4
5
6
7
8
9
<?php
  if (isset($_FILES["profile-pic"])) {
    echo "A fájl neve: " . $_FILES["profile-pic"]["name"] . "<br/>";
    echo "A fájl ideiglenes neve: " . $_FILES["profile-pic"]["tmp_name"] . "<br/>";
    echo "A fájl mérete (bájtokban): " . $_FILES["profile-pic"]["size"] . "<br/>";
    echo "A fájl típusa: " . $_FILES["profile-pic"]["type"] . "<br/>";
    echo "Hibakód: " . $_FILES["profile-pic"]["error"] . "<br/>";
  }
?>

A fenti kód kimenete egy kép feltöltését követően

A fájl neve: profile.jpg A fájl ideiglenes neve: C:\xampp\tmp\php356.tmp A fájl mérete (bájtokban): 53351 A fájl típusa: image/jpeg Hibakód: 0

Kiterjesztés lekérdezése

PHP-ban a feltöltött fájlok kiterjesztését szerveroldalon is lekérdezhetjük.

Az egyik módszer a kiterjesztés lekérdezésére, hogy beépített függvények használatával lekérjük a fájl nevében az utolsó . (pont) karakter utáni szövegrészt:

  1. Először az explode() függvénnyel feldaraboljuk a fájlnevet pont karakterek mentén. Ez egy tömbben adja vissza a feldarabolás után kapott elemeket.
  2. Az így kapott tömbnek vesszük az utolsó elemét az end() függvénnyel.
  3. Végezetül, hogy a kiterjesztés vizsgálata ne legyen érzékeny a kis- és nagybetűkre, csupa kisbetűssé alakítjuk a kiterjesztést az strtolower() függvénnyel (persze csupa nagybetűssé is alakíthattuk volna az strtoupper() használatával).

Példa: Fájl kiterjesztésének lekérdezése (1. módszer)

1
2
3
4
5
6
7
<?php
  $fajlnev = $_FILES["profile-pic"]["name"];
  $darabok = explode(".", $fajlnev);            // fájlnév feldarabolása pont karakterek mentén
  $kiterjesztes = strtolower(end($darabok));    // a feldarabolás után kapott értékek közül az utolsó lesz a kiterjesztés

  echo "A fájl kiterjesztése: $kiterjesztes <br/>";   // "A fájl kiterjesztése: jpg"
?>

Egy másik módszer a pathinfo($path, PATHINFO_EXTENSION) beépített függvény használata. Itt a $path helyén a feltöltött fájl nevét (name) adjuk meg.

Ahhoz, hogy a fájl kiterjesztése ne legyen kis- és nagybetűérzékeny, itt is érdemes csupa kisbetűssé (vagy ízlés szerint csupa nagybetűssé) alakítani azt.

Példa: Fájl kiterjesztésének lekérdezése (2. módszer)

1
2
3
4
5
6
<?php
  $fajlnev = $_FILES["profile-pic"]["name"];
  $kiterjesztes = strtolower(pathinfo($fajlnev, PATHINFO_EXTENSION));

  echo "A fájl kiterjesztése: $kiterjesztes <br/>";   // "A fájl kiterjesztése: jpg"
?>
Fájl átmozgatása

A feltöltött fájlok a feltöltést követően egy ideiglenes mappába kerülnek. A mi feladatunk, hogy innen átmásoljuk őket egy állandó helyre, különben egy idő után törlődnek.

A feltöltött fájlok átmozgatására a move_uploaded_file($t_name, $dest) beépített függvény szolgál, amivel a $t_name ideiglenes névvel (tmp_name) rendelkező fájlt áthelyezhetjük az ideiglenes mappából a $dest célhelyre. A függvény TRUE-t ad vissza, ha sikerült átmozgatni a fájlt, FALSE-ot egyébként.

Ha a célhelyen létezik már az átmozgatott fájllal megegyező nevű állomány, akkor az alapértelmezett módon felül lesz írva. Amennyiben ezt nem szeretnénk, akkor a file_exists() függvénnyel ellenőrizhetjük, hogy a megadott elérési útvonalú fájl létezik-e.

Példa: Egy feltöltött fájl átmozgatása az images mappába

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
  // összeállítjuk a cél útvonalat: ez most az images/<fájl neve> útvonal lesz
  $cel_utvonal = "images/" . $_FILES["profile-pic"]["name"];

  // megpróbáljuk átmozgatni a fájlt a cél útvonalra (az azonos nevű fájlt ekkor felülírjuk!)
  if (move_uploaded_file($_FILES["profile-pic"]["tmp_name"], $cel_utvonal)) {
    echo "A fájl sikeresen átmozgatásra került!";
  } else {
    echo "Hiba történt a fájl átmozgatása során!";
  }
?>
A teljes fájlfeldolgozást végző PHP program

Írjuk meg a process.php-ban a az anyagrész elején található profilkép feltöltő űrlap feldolgozását az alábbi szempontok alapján!

  • Csak JPG, JPEG és PNG kiterjesztésű fájlokat lehessen feltölteni a szerverre!
  • A feltöltött fájl mérete ne lehessen több 30 MB-nál!
  • Ha a feltöltés sikeres, és a kép megfelel a fenti két elvárásnak, akkor mozgassuk át az images mappába! Amennyiben már létezik ebben a mappában egy ilyen nevű kép, akkor írassunk ki figyelmeztetést az eredeti kép felülírásáról!
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
  if (isset($_FILES["profile-pic"])) {
    // csak JPG, JPEG és PNG kiterjesztésű képeket szeretnénk engedélyezni a feltöltéskor
    $engedelyezett_kiterjesztesek = ["jpg", "jpeg", "png"];

    // a feltöltött fájl kiterjesztésének lekérdezése
    $kiterjesztes = strtolower(pathinfo($_FILES["profile-pic"]["name"], PATHINFO_EXTENSION));

    // ha a fájl kiterjesztése szerepel az engedélyezett kiterjesztések között...
    if (in_array($kiterjesztes, $engedelyezett_kiterjesztesek)) {
      // ha a fájl feltöltése sikeresen megtörtént...
      if ($_FILES["profile-pic"]["error"] === 0) {
        // ha a fájlméret nem nagyobb 30 MB-nál...
        if ($_FILES["profile-pic"]["size"] <= 31457280) {
          // a cél útvonal összeállítása
          $cel = "images/" . $_FILES["profile-pic"]["name"];

          // ha már létezik ilyen nevű fájl a cél útvonalon, figyelmeztetést írunk ki
          if (file_exists($cel)) {
            echo "<strong>Figyelem:</strong> A régebbi fájl felülírásra kerül! <br/>";
          }

          // a fájl átmozgatása a cél útvonalra
          if (move_uploaded_file($_FILES["profile-pic"]["tmp_name"], $cel)) {
            echo "Sikeres fájlfeltöltés! <br/>";
          } else {
            echo "<strong>Hiba:</strong> A fájl átmozgatása nem sikerült! <br/>";
          }
        } else {
          echo "<strong>Hiba:</strong> A fájl mérete túl nagy! <br/>";
        }
      } else {
        echo "<strong>Hiba:</strong> A fájlfeltöltés nem sikerült! <br/>";
      }
    } else {
      echo "<strong>Hiba:</strong> A fájl kiterjesztése nem megfelelő! <br/>";
    }
  }
?>
További gyakorló feladat

Feladat

Egészítsd ki az előző fejezetben megírt webes projektet a következő funkciókkal:

  • A regisztráció során legyen lehetőség profilkép feltöltésére is! A profilkép feltöltése ne legyen kötelező!
  • A "Profilom" oldalon jelenítsd meg a felhasználó profilképét! Amennyiben a felhasználó még nem töltött fel profilképet, akkor egy alapértelmezett kép jelenjen meg!
  • A "Profilom" oldalon legyen lehetőség a profilkép megváltoztatására is!

A felhasználók profilképeit tároljuk egy images mappában! A feltöltött képek neve a felhasznalonev.kiterjesztes formátumot kövesse! Az engedélyezett kiterjesztések: PNG, JPG, JPEG.

Tippek a feladat megoldásához:

  • Mivel két fájltöltésünk is lesz (egy a regisztrációnál, egy pedig a profil oldalon), ezért a fájlfeltöltést végző kódot érdemes kiszervezni a functions.php állományba egy függvényként.
  • A profilkép módosításakor érdemes először a már meglévő profilképet törölni. Ezt az unlink($path) függvénnyel tehetjük meg (ahol $path a törlendő fájl elérési útvonala).

Felhasznált irodalom

Számítógép Hálózatok gyakorlati jegyzet


Utolsó frissítés: 2024-02-10 19:01:32