În acest tutorial, scopul nostru este de a crea o clasă FTP cu PHP care să fie bine scrisă, utilă și extensibilă.
Este întotdeauna important să precizați mai întâi ce funcționalitate ar trebui să includă clasa ta. În cazul nostru:
Există mai multe situații când s-ar putea folosi acest tip de clasă. Câteva scenarii ar putea fi:
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.
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.
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.
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ă.
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.
Î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 întoarcemAdevărat
saufals
, 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.
Î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ă.
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ă!
Î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ă.
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
.
Î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!
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.
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.
// *** 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 esteascii
saubinar
.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!