Lavorare su FTP remoto con PHP

Sapevi che è possibile aprire una connessione FTP utilizzando il linguaggio PHP? Certo che è possibile ed è una pratica davvero molto utile per lavorare file o cartelle presenti su server remoti.
Grazie alle funzioni presenti di default nella libreria PHP, puoi gestire in pieno controllo files e cartelle presenti su un server remoto di cui hai un account FTP.
Ti interessa sapere come fare?
- Leggi l'articolo, ti bastano solo 1 minuto, 16 secondi
Sei di fretta? Scarica il PDF e consultalo quando vuoi!
Sommario
I parametri necessari
Ovviamente, la connessione FTP ad un server remoto è possibile solamente se si dispone delle credenziali di accesso allo stesso.
Ti occorrono:
- HOST: l’indirizzo IP oppure il nome host a cui connettersi
Esempio: ftp://nomedelsito.com - USER: il nome utente dell’account FTP con cui si desidera connettersi
- PASSWORD: la password di accesso dell’account con cui si desidera connettersi
Iniziamo quindi proprio con il dichiarare le variabili necessarie da utilizzare per la connessione:
<?php // Parametri di accesso al server remoto tramite FTP $ftp_host = "ftp://nomedelsito.com"; $ftp_username = "nome_utente"; $ftp_password = "password_di_accesso";
Il primo passo è compiuto, abbiamo preparato il terreno per effettuare la tua prima connessione FTP tramite PHP, ora hai la possibilità di connetterti al server FTP utilizzando due funzioni già incluse nella libreria PHP: ftp_connect() e ftp_login().
Connessione al server
La prima funzione, ftp_connect(), si occupa di aprire una comunicazione con un server remoto ed accetta tre parametri, di cui il primo è obbligatorio:
- $host: l’indirizzo del server verso cui aprire la connessione;
- $port: la porta di comunicazione del server attraverso cui aprire la connessione. Se non specificato, la funzione utilizzerà la porta di default per FTP, ovvero 21;
- $timeout: il tempo massimo di attesa senza operazioni entro cui la connessione viene mantenuta aperta. Se non specificato, il timeout verrà impostato a 90 secondi;
La funzione ftp_connect() restituisce uno stream FTP in caso di successo, oppure il valore bollano false in caso di errore di connessione.
La teoria è sempre noiosa, lo so, ma è necessario avere le basi prima di provare! Passiamo ora alla pratica; riprendendo quanto già visto nel primo paragrafo circa le variabili necessarie, avrai:
<?php // Parametri di accesso al server remoto tramite FTP $ftp_host = "ftp://nomedelsito.com"; $ftp_username = "nome_utente"; $ftp_password = "password_di_accesso"; // Stabilisce la connessione al server remoto tramite FTP $ftp = ftp_connect( $ftp_host ); // Controlla se la connessione è andata a buon fine if ( ! $ftp ) { echo "Connessione FTP fallita."; exit; } // Chiude la connessione FTP ftp_close( $ftp_stream );
In questo modo, lo script tenta di aprire una connessione FTP verso il server host ed in caso di errore, termina la sua esecuzione visualizzando un avviso di connessione fallita.
Per approfondire il funzionamento della funzione ftp_connect(), dai un’occhiata qui:
Login al server
Se la connessione va a buon fine, vuol dire che il server host ci ha risposto ed è disponibile a dialogare con lo script, ma per farlo è necessario “farsi riconoscere”. La seconda funzione menzionata in precedenza, ftp_login(), si occupa appunto di effettuare l’accesso al server, tramite la coppia username/password.
La funzione ftp_login(), accetta tre parametri, tutti obbligatori:
- $ftp_stream: la risorsa FTP che identifica la connessione al server FTP, ottenuta in precedenza dalla funzione ftp_connect();
- $username: il nome utente dell’account con cui di desidera accedere;
- $password: la password di accesso relativa all’account con cui di desidera accedere;
La funzione ftp_login() restituisce i valori booleani true oppure false a seconda se l’accesso va a buon fine o fallisce.
Aggiungiamo un altro mattoncino allo script precedente, ottenendo:
<?php // Parametri di accesso al server remoto tramite FTP $ftp_host = "ftp://nomedelsito.com"; $ftp_username = "nome_utente"; $ftp_password = "password_di_accesso"; // Stabilisce la connessione al server remoto tramite FTP $ftp = ftp_connect( $ftp_host ); // Controlla se la connessione è andata a buon fine if ( ! $ftp ) { echo "Connessione FTP fallita."; exit; } // Effettua il login al server remoto tramite FTP $ftp_login = @ftp_login( $ftp_stream, $ftp_username, $ftp_password ); // Controlla se il tentativo di login è andato a buon fine if ( ! $ftp_login ) { echo "Login FTP fallito."; exit; } // Chiude la connessione FTP ftp_close( $ftp_stream );
Hai notato il simbolo “@” alla riga 18, prima della chiamata alla funzione ftp_login()? A cosa serve?
Il simbolo “@” prima della chiamata ad una funzione in PHP è utilizzato per “silenziare” gli eventuali errori minori (notices/warnings) generati dalla funzione. In questo caso, visto che la funzione ftp_login() restituisce un warning in caso di insuccesso nel login, con il simbolo “@” previeni la visualizzazione del messaggio di warning, molto molto fastidiosa.
Per approfondire il funzionamento della funzione ftp_login(), puoi leggere:
Bene, ora sei ufficialmente connesso al server FTP remoto! Ma cosa è possibile fare adesso?
Download di un file dal server remoto FTP
Una delle operazioni più utilizzate è sicuramente il download di un file tramite FTP. La funzione da utilizzare è ftp_get(), che accetta cinque parametri, di cui i primi tre obbligatori:
- $ftp_stream: la risorsa FTP che identifica la connessione al server FTP, ottenuta in precedenza dalla funzione ftp_connect();
- $local_file: il percorso locale del file da prelevare;
- $remote_file: il percorso sul server remoto in cui è presente il file, completo del nome del file;
- $mode: la modalità di trasferimento del file. Può essere FTP_ASCII o FTP_BINARY;
- $resumepos: la posizione in cui iniziare il download del file;
La funzione ftp_get() restituisce i valori booleani true oppure false a seconda se il download va a buon fine o fallisce.
Nel caso tu voglia effettuare il download di un file da server remoto FTP, lo script diventa:
<?php // Parametri di accesso al server remoto tramite FTP $ftp_host = "ftp://nomedelsito.com"; $ftp_username = "nome_utente"; $ftp_password = "password_di_accesso"; // Stabilisce la connessione al server remoto tramite FTP $ftp = ftp_connect( $ftp_host ); // Controlla se la connessione è andata a buon fine if ( ! $ftp ) { echo "Connessione FTP fallita."; exit; } // Effettua il login al server remoto tramite FTP $ftp_login = @ftp_login( $ftp_stream, $ftp_username, $ftp_password ); // Controlla se il tentativo di login è andato a buon fine if ( ! $ftp_login ) { echo "Login FTP fallito."; exit; } // Imposta le variabili relative al file da gestire $remote_file = "remote_test.txt"; $local_file = "downloads/local_test.txt"; // Tenta di prelevare il file da server remoto FTP $ftp_get_response = ftp_get( $ftp_stream, $local_file, $remote_file ); // Controlla se il tentativo di download è andato a buon fine if ( $ftp_get_response ) { echo "Download completato con successo"; } else { echo "Si è verificato un errore nel download del file"; } // Chiude la connessione FTP ftp_close( $ftp_stream );
In questo esempio, abbiamo effettuato il download del file remote_test.txt presente nella root del server remoto nella cartella downloads/ del server locale, rinominandolo in local_test.txt.
Semplice no?
Per approfondire il funzionamento della funzione ftp_get(), puoi leggere:
Upload di un file sul server remoto FTP
Per trasmettere un file da un server ad un altro tramite FTP, la funzione da impiegare è ftp_put(), che, analogamente ad ftp_get(), utilizza cinque parametri, di cui i primi tre obbligatori:
- $ftp_stream: la risorsa FTP che identifica la connessione al server FTP, ottenuta in precedenza dalla funzione ftp_connect();
- $remote_file: il percorso sul server remoto in cui posizionare il file, completo del nome del file;
- $local_file: il percorso locale del file da uploadare;
- $mode: la modalità di trasferimento del file. Può essere FTP_ASCII o FTP_BINARY;
- $startpos: la posizione in cui iniziare l’upload del file;
La funzione ftp_put() restituisce i valori booleani true oppure false a seconda se l’upload va a buon fine o fallisce.
Nel caso tu voglia effettuare l’upload di un file su server remoto FTP, lo script diventa:
<?php // Parametri di accesso al server remoto tramite FTP $ftp_host = "ftp://nomedelsito.com"; $ftp_username = "nome_utente"; $ftp_password = "password_di_accesso"; // Stabilisce la connessione al server remoto tramite FTP $ftp = ftp_connect( $ftp_host ); // Controlla se la connessione è andata a buon fine if ( ! $ftp ) { echo "Connessione FTP fallita."; exit; } // Effettua il login al server remoto tramite FTP $ftp_login = @ftp_login( $ftp_stream, $ftp_username, $ftp_password ); // Controlla se il tentativo di login è andato a buon fine if ( ! $ftp_login ) { echo "Login FTP fallito."; exit; } // Imposta le variabili relative al file da gestire $remote_file = "uploads/remote_test.txt"; $local_file = "local_test.txt"; // Tenta di caricare il file su server remoto FTP $ftp_put_response = ftp_put( $ftp_stream, $remote_file, $local_file ); // Controlla se il tentativo di upload è andato a buon fine if ( $ftp_put_response ) { echo "Upload completato con successo"; } else { echo "Si è verificato un errore nell'upload del file"; } // Chiude la connessione FTP ftp_close( $ftp_stream );
In questo esempio, abbiamo effettuato l’upload del file local_test.txt presente nella stessa cartella dello script nella cartella del server remoto uploads/, rinominandolo in remote_test.txt.
Per approfondire il funzionamento della funzione ftp_put(), puoi leggere:
Rinominare un file dal server remoto FTP
Un’altra funzione utile per lavorare con FTP e PHP è sicuramente ftp_rename() che permette di modificare il nome di un file presente su un server remoto. Accetta tre parametri, tutti obbligatori:
- $ftp_stream: la risorsa FTP che identifica la connessione al server FTP, ottenuta in precedenza dalla funzione ftp_connect();
- $oldname: il nome del file da rinominare, completo di percorso;
- $newname: il nuovo nome che si desidera dare al file;
La funzione ftp_rename() restituisce i valori booleani true oppure false a seconda se la modifica del nome va a buon fine o fallisce.
Uno script di esempio per rinominare un file remoto tramite FTP potrebbe essere:
<?php // Parametri di accesso al server remoto tramite FTP $ftp_host = "ftp://nomedelsito.com"; $ftp_username = "nome_utente"; $ftp_password = "password_di_accesso"; // Stabilisce la connessione al server remoto tramite FTP $ftp = ftp_connect( $ftp_host ); // Controlla se la connessione è andata a buon fine if ( ! $ftp ) { echo "Connessione FTP fallita."; exit; } // Effettua il login al server remoto tramite FTP $ftp_login = @ftp_login( $ftp_stream, $ftp_username, $ftp_password ); // Controlla se il tentativo di login è andato a buon fine if ( ! $ftp_login ) { echo "Login FTP fallito."; exit; } // Imposta le variabili relative al file da gestire $old_filename = "old_test.txt"; $new_filename = "new_test.txt"; // Tenta di rinominare il file su server remoto FTP $ftp_rename_response = ftp_rename( $ftp_stream, $old_filename, $new_filename ); // Controlla se il tentativo di rinomina è andato a buon fine if ( $ftp_rename_response ) { echo "File rinominato con successo"; } else { echo "Si è verificato un errore nel rinominare il file"; } // Chiude la connessione FTP ftp_close( $ftp_stream );
Come sempre, per approfondire l’utilizzo della funzione ftp_rename(), troverai utile:
Altre funzioni utili
Analogamente alle funzioni più utilizzate, già descritte in questa guida, ne esistono altre altrettanto utili per poter lavorare tramite connessione FTP con PHP, eccone alcune:
- ftp_delete( $ftp_stream, $path ): elimina un file da server remoto;
- ftp_chmod( $ftp_stream, $mode, $filename ): permette di modificare i permessi di lettura/scrittura di un file presente su server remoto;
- ftp_mkdir( $ftp_stream, $directory ): consente di creare una nuova cartella su server remoto tramite connessione FTP;
Per una panoramica di tutte le funzioni che puoi utilizzare per gestire risorse tramite connessione FTP in PHP, ti consiglio di leggere:
Cosa aspetti? Non ti resta che iniziare a buttare giù qualche riga di codice!
Ciao, penso che l'articolo è molto linerare e spiega benissimo il modo di impostare uno script php, ma lascia spiazzato il lettore quando va a provare a mettere in pratica la teoria e il server remoto accetta la sua connessione ftp ma gli impedisce il trasferimento per problemi di permessi nelle cartelle. "..failed to open stream: Permission denied in…"
Comunque.. bravo l'articolo è interessante
Saluti