FTP folosind PHP

Share on:

Acum ceva vreme m-am lovit de un scenariu care pe cat este de bizar pe atat este de realist. Pe un anumit server a unei anumite mare companie de cablu se afla site-ul unei anumite companii. Pana aici nimic nou, dar cand incercam sa urc fisiere cu file managerul site-ului fisierele nu se puteau urca. Pe scurt problema era ca user-ul Apache si user-ul de FTP nu aveau aceleasi drepturi. Stand si analizand problema pana la urma nu este o idee rea si cu toate astea, eu cum fac cu fisierelele? Solutia era simpla, fisierele pur si simplu trebuiau urcate prin ftp.

In primul rand am realizat in acel moment ca este o idee buna realizarea unei clase de abstractizare pentru operatiile cu fisiere, dar nu voi vorbi despre asta, voi incerca doar sa schitez operatiile principale cu fisiere, oricum este un secenariu putin bizar dupa parerea mea.

Dupa ce am rasfoit putin manualul am vazut si cam de ce este nevoie.

In primul rand avem nevoie de o conexiune FTP:

 1// conectarea la server-ul ftp
 2$ftp = ftp_connect("ftp.example.com") or die("nu se conecteaza la server");
 3
 4// face login-ul propriuzis
 5$login_result = ftp_login($ftp, FTP_USER, FTP_PASS) or die("nu face log-in");
 6
 7// aici vor fi operatiile
 8
 9// se inchide conexiunea la server
10ftp_close($ftp);

Copiere
Fata de metoda “traditionala” cand copierea era facuta simplu cu functii precum copy() sau move_uploaded_file(), prin ftp trebuie sa mai luam in calcul directorul unde se face aceasta:

1// schimbam locatia in directorul destinatie
2ftp_chdir($ftp, 'director/destinatie/');
3
4// se copiaza fisierul care a fost urcat pe server in mod binar
5ftp_put($ftp, 'fisier-destinatie.tip', $_FILES['fisier']['tmp_name'] ,
6   FTP_BINARY) or die("nu copiaza");

Ceva mai mult parametri dar destul de direct. In exemplul de mai sus am folosit un fisier care a fost urcat printr-un formular POST. Iar dupa cum se poate vedea mie imi place sa folosesc “or die()” in loc de if(), dar in productie nu este cea mai buna idee.

Modificare drepturi
Se face folosind o functie similara cu chmod():

1ftp_chmod($ftp, 0644, 'fisier.tip') or die("eroare in schimbarea drepturilor");

Destul de simplu, nu? Fata de chmod() practic mai apare si conexiunea.
Redenumire
Ca si mai devreme foarte similara cu rename():

1ftp_rename($ftp, 'nume_vechi.tip', 'nume_nou.tip')
2     or die("eroare la redenumire");

Crearea de foldere
Similar cu mkdir():

1ftp_mkdir($ftp, 'director') or die("eroare creare director");

Stergere
Foarte similar cu unlink():

1ftp_delete($ftp, 'fisier') or die("eroare la stergere");

Concluzionand functile sunt foarte similare cu cele de baza, iar cu ajutorul lor se pot face relativ usor clase de abstractizare.

PS: Am mai gasit un scenariu pentru care e interesanta folositea unei astfel de abordari, daca exista fisiere intr-un director pe server si trebuie modificate drepturile acestora doar pentru fisiere specifice, de exemplu intr-un director cu poze.