Incarcarea unui fisier pe server se face prin intermediul formularelor. Pentru aceasta facilitate se foloseste un formular putin diferit: are un atribut special (enc-type) si metoda POST. De asemenea, trebuie sa contina un element input de tip file pentru fiecare fisier incarcat (spre exemplu, daca se incarca 2 fisiere, va fi nevoie de 2 elemente input).
Pentru ca functionalitatea de upload sa fie functioneze, trebuie indeplinite urmatoarele conditii:
directiva file_uploads din fisierul de configurari al PHP (php.ini) trebuie sa fie 'on'
directiva upload_tmp_dir din php.ini trebuie sa se refere la o cale existenta pe server si cu permisiuni suficiente pentru ca web-serverul sa poata crea fisiere
directivele upload_max_filesize si post_max_size din php.ini specifica marimea maxima a fisierului si respectiv a datelor ce pot fi transmise prin intermediul formularului; este recomandat ca aceste valori sa fie revizuite
atributul enctype="multipart/form-data" NU TREBUIE omis, altfel uploadul nu va functiona
Nota: de obicei, interpretorul PHP este configurat deja pentru upload de fisiere, deci primele 3 conditii de mai sus sunt aproape intotdeauna indeplinite fara a fi nevoie de alte configurari. Acesta este si cazul pachetului EasyPHP la care incarcarea de fisiere este activata si configurata implicit.
Un exemplu de formular pentru upload de fisiere este mai jos:
Nota asupra mecanismului de upload:
atunci cand se face submit la formular, browser-ul web transmite catre server continutul fisierului
serverul web copiaza fisierul transmis intr-o locatie temporara (specificata de directiva upload_tmp_dir)
interpretorul PHP este invocat, avand variabila $_FILES populata cu informatii despre upload
programatorul este responsabil cu prelucrarea fisierului incarcat pe server (mutare intr-o alta locatie, citire, copiere, etc); prelucrarea ce se face cu ajutorul functiilor puse la dispozitie de PHP. Daca fisierul incarcat nu este mutat (sau redenumit) din locatia temporara, acesta va fi sters automat la terminarea executiei scriptului (la finalul requestului, mai exact).
Fisierul PHP (upload.php) ce va prelucra uploadul contiune urmatoarea secventa de cod (include si validare).
Cod: Selectaţi tot
$mul*(int)$POST_MAX_SIZE && $POST_MAX_SIZE ) { print "Fisier prea mare! Ati depasit limita maxima permisa"; } } else { print "Eroare nespecificata (probabil fisierul este prea mare)"; } } else { # nu s-a facut inca submit la fisier, afisez un mesaj print "Apasati pe 'Trimite fisier' pentru a face upload!"; } } else { # $_POST si $_FILES sunt setate; verific alte erori ce pot sa apara if( $_FILES['fisier']['error'] > 0 ) { print "A intervenit o eroare (#{$_FILES['fisier']['error']})"; } else { # fisierul uploadat va fi pus in subfolderul 'upload' (care trebuie sa # existe deja in aceeasi locatie ca si fisierul upload.php $uploaddir = dirname( __FILE__ ). DIRECTORY_SEPARATOR . 'upload' . DIRECTORY_SEPARATOR; $uploadfile = $uploaddir . basename($_FILES['fisier']['name']); if (move_uploaded_file($_FILES['fisier']['tmp_name'], $uploadfile)) { print "Fisier incarcat cu succes!"; } else { print "Nu s-a putut incarca fisierul"; } } } ?>
Cand este nevoie sa se incarce mai multe fisiere in acelasi timp, formularul va contine mai multe elemente de tip INPUT FILE, denumite sub forma unui vector (array):
Codul PHP pentru prelucrarea uploadului trebuie scris in acelasi fisier ca si formularul (intrucat atributul action nu specifica in mod explicit un fisier PHP).
Nota: acesta este o varianta cu validari minimale.
Cod: Selectaţi tot
$error) { if ($error > 0) { # echivalent cu ( $_FILES["pictures"]["error"][$key] > 0 ) print "Eroare cu fisierul {$_FILES["pictures"]["tmp_name"][$key]}!"; } else { $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; $name = $_FILES["pictures"]["name"][$key]; # mut fisierul din locatia temporara in directorul curent (acelasi # director in care se afla scriptul PHP) move_uploaded_file($tmp_name, "$name"); } } ?>