Cum se lucrează cu PHP și FTP

În acest tutorial, scopul nostru este de a crea o clasă FTP cu PHP care să fie bine scrisă, utilă și extensibilă.

Descrierea obiectivului nostru

Este întotdeauna important să precizați mai întâi ce funcționalitate ar trebui să includă clasa ta. În cazul nostru:

  • conectarea la un server
  • creați un dosar pe server
  • incarca un fisier
  • schimbați directorul
  • preluarea înregistrării directoarelor
  • descărcați un fișier

Când aș folosi o clasă FTP?

Există mai multe situații când s-ar putea folosi acest tip de clasă. Câteva scenarii ar putea fi:

  • Automatizați încărcarea imaginilor, cum ar fi o galerie, pe site-ul unui client (în mod ideal, împreună cu imaginea de redimensionare a imaginii)
  • Efectuați copii de rezervă în afara spațiului de lucru transferând un fișier de copiere de rezervă de la server la altul. (Notă: Acest lucru nu este recomandat pentru informații sensibile, deoarece FTP nu este un protocol foarte sigur.)

Notă: Este ușor să rulați probleme cu FTP din cauza diferitelor configurații ale serverului. Acest cod a fost testat cu succes pe un număr de servere FTP.


Ce este FTP?

FTP: "Un protocol de rețea standard folosit pentru a copia un fișier de la o gazdă la alta."

FTP sau File Transfer Protocol este definit de Wikipedia: "Un protocol de rețea standard folosit pentru a copia un fișier de la o gazdă la alta printr-o rețea bazată pe TCP / IP, cum ar fi Internetul."

În esență, vă permite să copiați un fișier (fișiere) de la un computer la altul.


Pasul 1 - Pregătirea

Vom începe cât mai ușor posibil. În rădăcina noului dvs. proiect, creați două fișiere: index.php și ftp_class.php.

index.php fișierul este pagina noastră principală care creează obiectul și solicită metodele necesare. ftp_class.php este doar că: clasa noastră FTP.

În pasul următor, vom crea scheletul pentru clasa noastră. Odată ce acest lucru este în vigoare, veți putea urmări și încerca fiecare pas.


Pasul 2 - Configurarea clasei

Rezistența programării orientate pe obiecte (OOP) este de a oferi codului complex o interfață ușor de utilizat. Prin crearea unei clase - gândiți-vă la o clasă ca model - puteți încapsula datele, care este pur și simplu jargon pentru un termen care se referă la ascunderea datelor. Putem apoi reutiliza această clasă mereu și repede fără a fi nevoie să rescrieți codul. În schimb, trebuie doar să apelați metodele adecvate (termenul "metodă" este la fel ca funcţie).

Să începem să creăm clasa noastră FTP. Deschide-ți ftp_class.php fișier și adăugați următorul cod. Aceasta este o structură de bază a scheletului de clasă, pe care am numit-FTPClient'.

construi funcția cunoscută ca constructor este o metodă de clasă specială care este apelată automat de clasă când creați un obiect nou sau o instanță a clasei. Acesta este, de obicei, un loc bun pentru a adăuga o inițializare; dar pentru scopul de astăzi, nu avem nevoie de ea. Cu toate acestea, o vom păstra aici pentru utilizare ulterioară.

 Clasa FTPClient // *** Clasa funcții publice variabile __construct () 

Rețineți că folosim a dubla subliniază pentru asta construi metodă.


Pasul 3 - Variabile de clasă

Apoi vom seta unele variabile de clasă sau proprietăți.

 private $ connectionId; privat $ loginOk = false; privat $ messageArray = array ();

""privat"prefixul definește domeniul de aplicare al variabilei, în acest caz înseamnă că variabila nu poate fi accesată de oriunde în afara clasei.

$ connectionId variabila va stoca fluxul de conexiune. Celelalte două stochează starea și orice mesaje. $ loginOk va fi util atunci când se stabilește dacă suntem conectați corespunzător.


Pasul 4 - Logarea simplă a mesajelor

În aproape toate metodele, vom numi o metodă, numită "logMessage. Acesta este un manipulator de mesaje foarte simplu, care ne va permite sa surprindem orice mesaje create de clasa noastra, astfel incat sa putem oferi utilizatorului feedback.

Rețineți că nu întoarcere mesajele reale din cadrul metodelor noastre. În schimb, ne întoarcem Adevărat sau fals, bazat pe faptul dacă o anumită operațiune a avut succes sau nu. Acest lucru are avantajele sale, dar, de asemenea, nu detaliază utilizatorului ceea ce se întâmplă.

Adăugați următoarele două metode, astfel încât să putem determina ce are succes.

Această metodă acceptă o variabilă, $ mesaj. Conținutul acestei variabile este apoi salvat în matricea noastră de clasă, datorită liniei: $ this-> messageArray [] = $ mesaj;

 funcția privată logMessage ($ message) $ this-> messageArray [] = $ message; 

pentru că $ messageArray este o variabilă de clasă, putem accesa, prin intermediul $ This-> notaţie.

Într-o clasă, $ this se referă la obiectul însuși.

Pentru a prelua mesajul, sunăm getMessages.

 funcția publică getMessages () return $ this-> messageArray; 

Această metodă este o metodă publică. După cum am menționat anterior, această afacere privată / publică se referă pur și simplu la domeniul de aplicare a variabilei, sau în acest caz, a metodei. O metodă privată (sau o variabilă) nu poate fi accesată în afara clasei, în timp ce o metodă publică (sau o variabilă) poate.

Deoarece variabila noastră este privată, avem nevoie de o modalitate de accesare a acesteia. Noi facem acest lucru oferindu-ne clasa a public metoda pe care o putem accesa în afara clasei. S-ar putea să te întrebi de ce nu putem face pur și simplu messageArray publicul variabil. Noi putem; a spus că nu este o practică bună.

Notă: Există o mulțime de exemple în jurul rețelei de agenți de manipulare a mesajelor pline cu suflet sau de clase dedicate acestora. Lucrăm la o implementare simplă în scopul acestui tutorial.


Pasul 5 - Conectarea

În acest pas, vom adăuga conectați metodă. Acest lucru ne va permite să ne conectăm la un server FTP.

 funcția publică conectați ($ server, $ ftpUser, $ ftpPassword, $ isPassive = false) // *** Configurați conexiunea de bază $ this-> connectionId = ftp_connect ($ server); // *** Logați-vă cu numele de utilizator și parola $ loginResult = ftp_login ($ this-> connectionId, $ ftpUser, $ ftpPassword); // *** Activează / dezactivează modul pasiv (implicit dezactivat) ftp_pasv ($ this-> connectionId, $ isPassive); // *** Verificați conexiunea dacă ((! $ This-> connectionId) || (! $ LoginResult)) $ this-> logMessage ('Conexiunea FTP nu a reușit!'); $ this-> logMessage ('A încercat să se conecteze la'. $ server. 'pentru utilizator'. $ ftpUser, true); return false;  altceva $ this-> logMessage ('Conectat la'. $ server. ', pentru utilizator'. $ ftpUser); $ this-> loginOk = true; return true; 

Transmitem informațiile noastre de conectare: serverul ($ server de), nume de utilizator ($ ftpUser) și parola ($ ftpPassword) pentru a ne permite să stabilim o conexiune.

Prima linie de cod deschide o conexiune FTP, cu ftp_connect, la serverul specificat. Salvăm conexiunea noastră la variabila de clasă, $ connectionId descris mai sus.

Codul, ftp_login ne conectează la conexiunea specificată, trecând în noi ID-ul conexiunii, numele de utilizator și parola.

S-ar putea să fi observat ftp_pasv line de cod. Aceasta, așa cum implică comentariul, activează / dezactivează modul pasiv. Mi-ar sugera să-l lăsați, dar, dacă aveți probleme de conectare, încercați să-l porniți. Modul pasiv poate provoca un pic de mare atunci când se conectează prin FTP.

Noi determinăm dacă conexiunea a avut succes. Apoi, înregistrați rezultatele prin apelul metodei noastre simple de manipulare a mesajelor, logMessage (), și treceți șirul de legături. Amintiți-vă: folosim $ This-> a accesa logMessage (), deoarece este o variabilă de clasă.


Pasul 6 - Apelarea obiectului

Acum, că clasa noastră funcționează, o putem testa! Deschide-ți index.php fișier și adăugați următorul cod.

Veți avea nevoie de acces la un server FTP pentru a juca de-a lungul. Dacă doriți să configurați propriul server, încercați Filezilla - este gratuit.

Veți observa că am adăugat detaliile serverului FTP aici. În mod ideal, acestea ar fi stocate în interiorul dvs. config fişier. Modificați-le pentru a se potrivi cu setările serverului dvs. FTP.

După definirea detaliilor serverului FTP, vom include clasa cu includ ( 'ftp_class.php');. Aceasta înseamnă: faceți clasa disponibilă din această pagină. Următoarea linie creează un obiect al clasei noastre FTP și o stochează în variabila, $ ftpObj. $ ftpObj va fi acum utilizat pentru a accesa orice metodă publică din cadrul clasei noastre. Acest lucru se face folosind -> notație, la fel ca următoarea linie, prin apelarea $ ftpObj -> conectați metodă și transmiterea detaliilor despre server.

 // *** Definiți-vă gazda, numele de utilizator și parola definiți ('FTP_HOST', '192.168.1.88'); define ('FTP_USER', 'Blimpf'); defineste ('FTP_PASS', 'catfish'); // *** includeți clasa include ('ftp_class.php'); // *** Crearea obiectului FTP $ ftpObj = FTPClient nou (); // *** Conectați $ ftpObj -> conectați (FTP_HOST, FTP_USER, FTP_PASS);

După cum puteți vedea, odată ce clasa noastră este în vigoare, conectarea la serverul nostru FTP este într-adevăr destul de ușoară!


Pasul 6b - Vizualizarea rezultatului

În ultima etapă am putea împacheta apelul de conectare într-un dacă , după cum se arată mai jos. Apoi, dacă nu reușim să ne conectăm, codul dependent nu va fi executat. Putem apoi să transmitem orice mesaje către utilizator, cum ar fi "conectat" sau "nu a reușit".

 // *** Conectați dacă ($ ftpObj -> conectați (FTP_HOST, FTP_USER, FTP_PASS)) // *** Apoi adăugați codul FTP aici echo "conectat";  altceva echo 'Nu sa putut conecta'; 

Acest lucru este în regulă, deși codul nostru va deveni destul de umflat cu declarațiile IF / ELSE, dacă adăugăm acest lucru la toate apelurile noastre. În schimb, aș dori să ofer o alternativă care va face lucrurile puțin mai curate și mai ușor de urmărit.

Amintiți-vă metodele de gestionare a mesajelor adăugate Dacă doriți să vedeți mesajele produse de clasă - util pentru depanare / feedback - puteți adăuga următorul cod după orice metodă pe care o apelați.

 print_r ($ ftpObj -> getMessages ());

Aceasta va afișa mesajul de clasă.


Pasul 7 - Efectuarea primului nostru director

Excelent, acum e momentul să faci ceva util. Prima metodă pe care o vom crea este makeDir metodă. După cum era de așteptat, această metodă va crea directoare pentru noi pe server. Singurul parametru pe care îl vom transmite este calea directorului și numele dosarului; o să-i spunem director $. Linia magică aici este ftp_mkdir funcția încorporată. Folosește "connectionId"și a intrat director $ pentru a crea dosarul.

Adăugați următorul cod la adresa dvs. ftp_class.php fişier:

 funcția publică makeDir (directorul $) // *** Dacă crearea unui director este de succes? dacă (ftp_mkdir ($ this-> connectionId, directorul $)) $ this-> logMessage ('Directory' '. $ director "" creat cu succes "); return true;  altfel // ***? Altfel, FAIL. $ this-> logMessage ('Nu a reușit crearea directorului' '. $ directory' '' '); return false; 

Și să-l suni de la tine index.php fișier, adăugați:

 $ dir = 'fotografii'; // *** Face directorul $ ftpObj-> makeDir ($ dir);

Variabila, $ dir este setat la numele directorului pe care dorim să-l creăm pe server. În acest caz: "fotografii".

Următoarea linie apelează metoda care va crea dosarul.

Dacă primiți o eroare "Permisiune refuzată", asigurați-vă că puteți scrie în directorul specificat. Este posibil să aveți nevoie să creați dosarul dintr-un director, cum ar fi / httpdocs.


Pasul 8 - Încărcarea unui fișier

În continuare, să încărcăm o fotografie, numită zoe.jpg. Când încărcați un fișier, trebuie să specificați tipul de fișier pe care îl încărcăm - binar sau ascii? Practic, dacă încărcați un fișier text, ar trebui să folosim ascii; altfel, ar trebui setat la binar.

Începem prin înființarea unui mulțime cu toate extensiile pe care ar trebui să le folosim ascii tip upload.

 $ asciiArray = array ('txt', 'csv');

Apoi, vom prelua extensia fișierului nostru, astfel încât să putem testa dacă acesta este unul din ascii tipuri. Determinăm acest lucru prin obținerea extensiei fișierului pe care îl încărcăm. Metoda rapidă și murdară pe care am folosit-o aici este
prin "explodarea" fișierului utilizând "."ca delimiter. Aceasta va împărți fișierul în bucăți și va fi păstrat ca un mulțime. Folosind o altă funcție PHP încorporată, "end", selectăm ultima mulțime element care conține extensia noastră. E un cod mic ordonat.

 $ extension = sfârșit (explode ('.', $ fileFrom));

Apoi, vom testa dacă extensia noastră apare în listă (cu in_array) de extensii de fișiere care ar trebui încărcate ca tip ascii. Dacă apare în listă, setăm variabila mod de $ la FTP_ASCII; în caz contrar, presupunem că este de tip binar și atribuie mod de $ valoarea FTP_BINARY.

 in_array (extensie $, $ asciiArray)

ftp_put încarcă un fișier din locația dvs. locală într-un fișier la distanță de pe serverul ftp. Noi le transmitem "connectionId", calea către fișierul pe care dorim să o încărcăm ($ fileTo), calea
a fișierului pe care dorim să-l încărcăm ($ fileFrom) și modul (mod de $) pe care tocmai am determinat-o.

Apoi, adăugați următoarea metodă la dvs. ftp_class.php fişier:

 funcția publică uploadFile ($ fileFrom, $ fileTo) // *** Setați modul de transfer $ asciiArray = array ('txt', 'csv'); $ extension = sfârșit (explode ('.', $ fileFrom)); dacă (in_array ($ extensie, $ asciiArray)) $ mode = FTP_ASCII;  altceva $ mode = FTP_BINARY;  // *** Încărcați fișierul $ upload = ftp_put ($ this-> connectionId, $ fileTo, $ fileFrom, $ mode); // *** Verificați starea de încărcare dacă (! $ Upload) $ this-> logMessage ("Încarcarea FTP nu a reușit!"); return false;  altceva $ this-> logMessage ('Încărcat' '. $ fileFrom. "" ca "'. $ fileTo); return true;

Desigur, puteți crea sau încărca orice nume de folder doriți! Adăugați acest fragment de cod următor la dvs. index.php fișier și ajustați corespunzător.

 $ fileFrom = 'zoe.jpg'; $ fileTo = $ dir. '/'. $ FileFrom; // *** Încărcați fișierul local în directorul nou pe serverul $ ftpObj -> uploadFile ($ fileFrom, $ fileTo);

Pana acum, ar trebui sa te intalnesti cu cat de usor este sa folosesti aceasta clasa! Pur și simplu facem apeluri unice pentru a ne îndeplini sarcinile - toate datorită programării orientate obiect!


Pasul 9 - Vizualizarea fișierelor

Să confirmăm acum că fișierul nostru este în fotografie pliant. Putem face acest lucru navigând la secțiunea "fotografie"pe serverul nostru, apoi afișați conținutul.

changeDir metoda folosește "ftp_chdir"pentru a schimba directorul curent pe serverul ftp. Pur și simplu treceți în directorul pentru a trece la Simplu și dulce.

ftp_class.php:

 funcția publică changeDir (directorul $) if (ftp_chdir ($ this-> connectionId, $ directory)) $ this-> logMessage ('Directorul curent este acum:' ftp_pwd ($ this-> connectionId)); return true;  altceva $ this-> logMessage ('Nu s-ar putea schimba directorul'); return false; 

getDirListing va afișa conținutul directorului în care vă aflați utilizând funcția "ftp_nlist"Această funcție returnează o listă de fișiere dintr-un director dat .Directorul curent este setat implicit, astfel încât nu este necesar să furnizați parametri.

Dacă doriți, puteți trece peste acest lucru prin trecerea în director $ pe care doriți să vizualizați conținutul. parametrii $ variabilele implicite la "-la“. Aceasta este o comandă Linux pentru a afișa mai multe informații despre director. Simțiți-vă liber să-l eliminați sau să treceți într-un șir gol.

ftp_class.php:
 funcția publică getDirListing ($ director = '.', $ parameters = '-la') // obține conținutul directorului curent $ contentArray = ftp_nlist ($ this-> connectionId, $ parameters ". contentsArray;

getDirListing metoda returnează un mulțime care conține lista noastră de directoare.

index.php
 // *** Schimbați în directorul $ ftpObj-> changeDir ($ dir); // *** Obține conținutul dosarului $ contentsArray = $ ftpObj-> getDirListing (); // *** Efectuați matricea conținutului de dosare ecou '
„; print_r ($ contentsArray); echo "

„;

Rezultatul dvs. ar trebui să arate astfel:


Pasul 10 - Descărcarea unui fișier

Pe măsură ce împingem spre încheierea acestui tutorial, vom continua să descărcăm fișierul. Metoda începe cu același cod ca incarca fisier, în care determină dacă fișierul pe care dorim să îl descărcați este ascii sau binar.

Pentru această metodă, pur și simplu treceți numele fișierului (și eventual, calea, în funcție de dacă sunteți în același folder ca fișierul pe care doriți să îl descărcați) fișierului de descărcat și numele pe care doriți să îl aibă fișierul mașina dvs. client.

Pentru a descărca un fișier, trebuie să sunați ftp_get.

 ftp_get ($ this-> conexiuneId, $ fileTo, $ fileFrom, $ mode, 0)

Acest lucru descarcă un fișier de la un server de la distanță la mașina noastră locală. Acceptă următorul parametru: ID-ul de conectare, calea și numele fișierului pentru a fi salvate la nivel local (vor fi suprascrise dacă
deja exista) ($ fileTo), locația și numele fișierului de pe serverul de la distanță ($ fileFrom) și modul (mod de $).

ftp_class.php
 funcția publică downloadFile ($ fileFrom, $ fileTo) // *** Setați modul de transfer $ asciiArray = array ('txt', 'csv'); $ extension = sfârșit (explode ('.', $ fileFrom)); dacă (in_array ($ extensie, $ asciiArray)) $ mode = FTP_ASCII;  altceva $ mode = FTP_BINARY;  // încercați să descărcați $ remote_file și să-l salvați în $ manipulat dacă (ftp_get ($ this-> connectionId, $ fileTo, $ fileFrom, $ mode, 0)) return true; $ this-> logMessage ("fișier" ". $ fileTo." "descărcat cu succes");  altfel return false; $ this-> logMessage ('A apărut o eroare la descărcarea fișierului "'. $ fileFrom." "la" '. $ fileTo. ""); 

Vom descărca același fișier pe care l-am încărcat salvând-l cu alt nume pe mașina noastră client.

Notă: Din nou, asigurați-vă că permisiunile dvs. sunt setate corect!

Pentru că acum ar trebui să fim în interiorul nostru fotografie , nu adăugăm o cale către $ fileFrom variabilă - numai numele fișierului.

index.php
 $ fileFrom = 'zoe.jpg'; # Locația de pe server $ fileTo = 'zoe-new.jpg'; # Dir local pentru a salva în // *** Descărcare fișier $ ftpObj-> downloadFile ($ fileFrom, $ fileTo);

Pasul 11 ​​- Finalizarea

Pentru a finaliza clasa noastră, să adăugăm metoda magic magic, __deconstruct. Această metodă închide conexiunea noastră atunci când referința la obiectul nostru nu mai există - poate că pagina a fost închisă. În orice caz, acest cod este rulat și conexiunea este închisă. Este întotdeauna o practică bună să includeți acest lucru, deși nu este absolut necesar.

 funcția publică __deconstruct () if ($ this-> connectionId) ftp_close ($ this-> connectionId); 

Concluzie

Asta face! Sper că aveți acum o mai bună înțelegere a modului de utilizare a FTP cu PHP. Ar trebui să aveți acum competențele necesare pentru a extinde această clasă pentru a sprijini alte sarcini comune, cum ar fi redenumirea sau ștergerea fișierelor și dosarelor.

Asigurați-vă că ne-ați anunțat dacă creați niște clienți fideli PHP FTP!

Cod