Utilizare FTP cu PHP


FTP (File Transfer Protocol) este un protocol standard care realizeaza o conexiune client-server pentru transfer si manipulare de fisiere prin Internet.
Cu ajutorul FTP puteti adauga si copia fisiere (si directoare) de pe server sau sa le schimbati permisiunile CHMOD. PHP are functii speciale pentru conectarea la server si lucrul cu FTP.

1. Conectarea la server

Pentru conectarea la server prin FTP sunt necesare 3 date importante: adresa serverului (a domeniului), numele de utilizator si parola de conectare prin FTP.
La inceput se deschide o conexiune cu serverul, folosind functia ftp_connect(), aceasta preia ca argument necesar numele serverului, care de obicei are forma "ftp.server" ("server" poate fi numele domeniului sau adresa IP a acestuia). Daca deschiderea conexiunii s-a efectuat, functia va returna un ID a conexiunii, in caz contrar returneaza FALSE.
Dupa deschiderea conexiunii se face autentificarea pe server, pentru aceasta se foloseste functia ftp_login() care are urmatoarea sintaxa:
                ftp_login(conn_id, nume_user, parola)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "nume_user" este numele de utilizator pentru conectare la FTP, iar "parola" este parola utilizatorului.
Pentru inchiderea conectarii se foloseste functia ftp_close(), aceasta preia ca argument id-ul conexiunii.

Iata un exemplu de conectare prin FTP la server-ul unui site:

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.un_site.net';		// Poate fi de exemplu 'ftp.marplo.net'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 

// Executa autentificarea pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
echo "Conectare reusita la serverul $ftp_server, pentru utilizatorul $ftp_user";
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca s-a efectuat cu succes conectarea si autentificarea pe server, va afisa mesajul de confirmare, in caz contrar apare mesajul de eroare.
- La urma, "ftp_close($conn_id);" inchide conexiunea si elibereaza memoria alocata.

Conectarea la server folosind codul de mai sus este primul pas, dupa aceasta puteti folosi functiile PHP specifice FTP pentru a efectua diferite operatii, cum sunt: preluarea continutului directoarelor, incarcarea sau descarcarea de fisiere, crearea de noi directoare sau modificarea permisiunilor CHMOD.

2. Preluarea continutului directoarelor

Pentru a prelua continutul unui director (numele fisierelor si directoarelor din el) se foloseste functia
                ftp_nlist(conn_id, director)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "director" este numele directorului a carui continut va fi preluat
Aceasta functie returneaza o matrice secventiala a carei elemente sunt numele fiecarui director si fisier din catalogul cautat.
Mai jos este un exemplu practic.

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';		// Poate fi de exemplu 'ftp.marplo.net'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 

// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
// Obtine continutul directorului (numele de fisiere si directoare din el)
$continut = ftp_nlist($conn_id, ".");

// Parcurge matricea si afiseaza numele directoarelor si fisierelor returnate
for ($i=0; $i<count($continut); $i++) {
echo '<br>'.$continut[$i];
}
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Dupa setarea conexiunii si autentificarea pe server, daca conectarea a reusit este apelata functia "ftp_nlist()", care va stoca in variabila "$continut" matricea cu numele cataloagelor si fisierelor din directorul radacina (precizat de argumentul ".").
Daca doriti obtinerea datelor din alt director, de exemplu "www", puteti apela functia asa: ftp_nlist($conn_id, '/www').
- Pentru afisarea (sau preluarea) numelui fiecarui fisier si director returnat se parcurge matricea "$continut".
Rezultatul afisat de acest script va fi ceva similar cu cel de jos:
cgi-bin
private
public_html
statistics
www

3. Incarcare fisier pe server

Pentru incarcarea (upload) unui fisier pe server prin FTP cu PHP se foloseste functia ftp_put(), aceasta returneaza TRUE daca incarcarea s-a efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
                ftp_put(conn_id, destinatie, fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "destinatie" este directorul (si numele fisierului) pe server unde va fi incarcat fisierul
- "fisier" este numele fisierului care va fi copiat
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua valoarea FTP_ASCII sau FTP_BINARY

Iata un exemplu in care se copie un fisier de pe calculatorul client pe server, in directorul 'www':

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 

// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
// Datele cu numele fisierului, sursa unde se afla si directorul unde va fi incarcat pe server
$fisier = 'test.txt';
$sursa = 'c:/wamp/www/site/'. $fisier;
$destinatie = '/www/'. $fisier;

// Apeleaza functia "ftp_put()" pt. efectuarea transferului
// Afiseaza mesaj de reusita sau nu
if (ftp_put($conn_id, $destinatie, $sursa, FTP_BINARY)) echo "Fisierul $fisier a fost incarcat pe server";
else echo "Eroare, fisierul $fisier nu a putut fi incarcat pe server";
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer prin FTP, fisierul "test.txt" (aflat pe calculatorul client in directorul "c:/wamp/www/site/") va fi copiat pe server, in directorul "www/".
- Fisierul va fi incarcat cu acelasi nume, daca doriti sa fie transferat pe server cu alt nume, modificati la "$destinatie".

4. Copiere fisier de pe server

Pentru copierea (download) unui fisier de pe server pe calculatorul client se foloseste functia ftp_get(), aceasta returneaza TRUE daca transferul s-a efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
                ftp_get(conn_id, client, fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "client" este locatia de pe calculatorul client unde va fi copiat fisierul
- "fisier" este numele fisierului (si locatia) de pe server unde acesta se gaseste
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua valoarea FTP_ASCII sau FTP_BINARY

Iata un exemplu in care se descarca prin FTP un fisier de pe server pe calculatorul client:

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 

// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
// Datele cu numele fisierului, sursa unde se afla si directorul unde va fi copiat
$fisier = 'test.txt';
$server = '/www/'. $fisier;
$client = 'c:/download/'. $fisier;

// Apeleaza functia "ftp_get()" pt. efectuarea transferului
// Afiseaza mesaj de reusita sau nu
if (ftp_get($conn_id, $client, $server, FTP_BINARY)) echo "Fisierul $fisier a fost descarcat";
else echo "Eroare, fisierul $fisier nu a putut fi descarcat";
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer prin FTP, fisierul "test.txt" (aflat pe server in directorul "www/") va fi copiat pe calculatorul client, in directorul "c:/download/".
- Fisierul va fi copiatat cu acelasi nume, daca doriti sa fie descarcat pe calculator cu alt nume, modificati la "$client". Daca in directorul unde va fi copiat se mai afla un fisier cu acelasi nume, acesta va fi inlocuit cu cel descarcat de pe server.

5. Creare director pe server

Inainte de a crea un director nou prin FTP, setati directorul curent de lucru care reprezinta locatia unde doriti sa fie creat noul catalog. Pentru aceasta se foloseste functia ftp_chdir(conn_id, director); "conn_id" este id-ul conexiunii iar "director" este numele directorului care va fi setat pentru lucru.

Pentru crearea unui director pe server prin FTP se foloseste functia ftp_mkdir(), in caz de succes returneaza numele noului director creat, iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
                ftp_mkdir(conn_id, nume_dir)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "nume_dir" este numele noului director

Iata un exemplu in care se creaza un director "test" pe server, in "www/":

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 

// Executa conectare (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true); 

// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
$dir = 'un_director';		// Numele noului director

// Daca e setat directorul de lucru "www/"
if(ftp_chdir($conn_id, '/www/')) {
// Apeleaza functia "ftp_mkdir()" pt. crearea directorului
// Afiseaza mesaj de reusita sau nu
if (ftp_mkdir($conn_id, $dir)) echo "Directorul $dir a fost creat";
else echo "Eroare, directorul $dir nu a putut fi creat";
}
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si directorul curent de lucru (www/) este setat cu succes iar PHP are permisiuni de scriere pe server, in catalogul "www/" va fi creat directorul "un_director".

Pentru stergerea unui director se foloseste functia ftp_rmdir(conn_id, del_dir), unde "conn_id" este id-ul conexiunii iar "del_dir" este numele directorului care va fi sters.

6. Transferarea unei portiuni de fisier pe server

Pe langa transferul unui fisier complet, PHP ofera si functii pentru transferul unei anumite parti din continutul unui fisier.
O functie care face acest lucru este ftp_fput(), aceasta incarca pe server continut dintr-un fisier deschis cu "fopen()", returneaza TRUE in caz de succes, iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
                ftp_fput(conn_id, destinatie, pointer_fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "destinatie" este directorul de pe server unde va fi incarcat fisierul
- "pointer_fisier" reprezinta identificatorul (pointer-ul) de fisier deschis cu "fopen()". Retine continutul de la acest pointer pana la sfarsitul fisierului.
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua valoarea FTP_ASCII sau FTP_BINARY

Iata un exemplu in care este preluata o parte din continutul unui fisier si transferata intr-un fisier pe server:

<?php
$fisier = "test.txt";		// Fisierul care va fi deschis pt. citire

// Daca fisierul a fost deschis pt. citire
if ($fp = fopen($fisier, rb)) {
fseek($fp, 40);		// Seteaza pozitia pointer-ului in fisier

// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 

// Executa conectare (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
$destinatie = '/www/test2.txt';		// Directorul destinatie si numele fisierului

// Transfera continutul intr-un fisier nou pe server
// Afiseaza mesaj de reusita sau nu
if (ftp_fput($conn_id, $destinatie, $fp, FTP_BINARY)) echo 'Continutul a fost transferat';
else echo 'Eroare, continutul nu a putut fi transferat';
}

// Inchide conexiunea
ftp_close($conn_id);

// Elibereaza memoria ocupata de deschiderea fisierului
fclose($fp);
}
?>
- Daca fisierul "test.txt" a fost deschis pentru citire, functia "fseek($fp, 40)" muta pointer-ul la pozitia 40, astfel va fi retinut continutul din fisier care incepa de la caracterul 41 pana la sfarsit (primul caracter are pozitia 0).
- In continuare, daca s-a efectuat cu succes conexiunea si autentificarea prin FTP, se transfera continutul in fisierul "test2.txt" din directorul "www" de pe server (daca fisierul "test2.txt" exista deja pe server, continutul lui va fi inlocuit cu cel transferat).
In cazul in care doriti sa transferati intreg continutul unui fisier deschis cu "fopen()", nu este necesara utilizarea funtiei "fseek()".
Aceasta metoda este utila cand doriti sa adaugati un sir sau continut, de exemplu preluat dintr-un form, pe server prin FTP. Adaugati sirul intr-un fisier temporar pe care apoi il deschideti cu "fopen()" si transferati continutul cu "ftp_fput()".

Pentru stergerea unui fisier se foloseste functia ftp_delete(conn_id, 'cale/fisier'), unde "conn_id" este id-ul conexiunii iar "cale/fisier" este calea si numele fisierului care va fi sters.

7. Alte functii utile pentru FTP

Pe langa functiile prezentate in exemplele de mai sus, PHP are si alte functii utile pentru lucrul cu fisiere si directoare prin FTP.
Iata cateva din acestea:


O lista completa cu functiile PHP pentru FTP gasiti la adresa din urmatorul link Functii PHP pentru FTP

Creare documente PDF cu ... <<-- Anterior --- Urmator -->> PHP OOP - Clase, ...

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Ce tag adauga imagine in pagina web?
<div> <img> <span>
<img src="http://coursesweb.net/imgs/webcourses.gif" width="191" height="63" alt="Courses-Web" />
Care din aceste coduri CSS afiseaza textul inclinat?
font-style: italic; text-decoration: underline; font-weight: 500;
#id {
  font-style: italic;
}
Clic pe functia jQuery care ascunde animat un element HTML.
click() hide() show()
$(document).ready(function() {
  $(".a_class").click(function(){ $(this).hide("slow"); });
});
Clic pe functia definita corect in PHP.
fname function() {} function fname() {} function $fname() {};
function fname($a, $b) {
  echo $a * $b;
}
Indicati forma pentru Prezent Perfect Continuu a verbului "to walk" (a merge).
have walked have been walking be walking
I have been walking for 5 hours.
- Merg pe jos de 5 ore.
Indicati Trecutul Nedefinit pentru verbul "ser" (a fi) la forma Yo.
será sería fui
Yo fui entrenador.
- Am fost antrenor.
Conectare si utilizare FTP cu PHP - Tutorial PHP