Classe per l’invio di file tramite il protocollo FTP in PHP
In questo articolo vedremo una classe creata per l’utilizzo delle funzioni php per il trasferimento di file attraverso il protocollo FTP (File Transfer Protocol). Ho cercato di semplificare la classe per far eseguire le funzioni elementari utili per lo scambio di file con un server FTP remoto, utilizzando anche meccanismi per la verifica dei file che controllino che il file sia già presente sul server o meno.
Come al solito posto tutto il codice e, successivamente, verrà commentato. Ho chiamato la classe simpleFtp.
<?php
class simpleFtp {
//dati per l'accesso
var $ftp_host = ''; //indirizzo server ftp
var $username = ''; //nome utente per l'accesso ftp
var $pwd = ''; //password per l'accesso ftp
var $connect;
var $login;
var $source_file;
var $destination_file;
//nel costruttore effettuo connessione e login
function simpleFtp(){
//effettuo la connessione
$this->connect = ftp_connect($this->ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");
//effettuo il login
$this->login = ftp_login($this->connect, $this->username, $this->pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
}
//funzione per il trasferimento dei file
function trasferisci($sorgente, $destinazione){
//file da trasferire
$this->source_file = $sorgente;
//va indicato il percorso e il nome del file
$this->destination_file = $destinazione;
//verifico che il file non esista già altrimenti modifico il nome
$this->destination_file = $this->verificaFile($this->destination_file, 'put');
ftp_put($this->connect, $this->destination_file, $this->source_file, FTP_BINARY) or die("Errore durante l'upload del file $source_file nel server ftp");
}
function preleva($destinazione, $sorgente){
if($this->verificaEsistenza($sorgente)){
//file da trasferire dal server remoto
$this->source_file = $sorgente;
//percorso e nome locale da dare al file
$this->destination_file = $destinazione;
//verifico che il file non esista già altrimenti modifico il nome
$this->destination_file = $this->verificaFile($this->destination_file, 'get');
ftp_get($this->connect, $this->destination_file, $this->source_file, FTP_BINARY) or die("Errore durante il download del file $source_file nel server ftp");
}else
echo "File non trovato.";
}
//cancella un file sul server remoto
function cancella($file){
if($this->verificaEsistenza($file))
ftp_delete($this->connect, $file) or die("Errore durante la cancellazione del file dal server ftp");
else
echo "File non trovato";
}
//cambia la directory sul server remoto
function cambiaDirectory($dir){
ftp_chdir($this->connect,$dir) or die('Errore durante il cambio di directory');
}
//restituisce la directory corrente
function directoryCorrente(){
return ftp_pwd($this->connect);
}
//cambia i permessi su un file, i permessi devono essere a 4 cifre. Es.: 0755
function cambiaPermessiFile($permessi, $file){
if($this->verificaEsistenza($file) && is_numeric($permessi))
ftp_chmod($this->connect, $permessi, $file);
else
echo "File non trovato";
}
//rinomina un file sul server remoto
function rinomina($old, $new){
if($this->verificaEsistenza($old)){
$new = $this->verificaFile($new, 'put');
ftp_rename($this->connect, $old, $new);
}
else
echo "File non trovato";
}
//restituisce un array con i nomi dei file nella directory passata
function visualizzaFile($dir){
$result = ftp_nlist($this->connect, $dir);
return $result;
}
//crea una directory sul server remoto a partire dalla directory corrente
function creaDirectory($dir){
@ftp_mkdir($this->connect, $dir) or die('La directory esiste già o non hai i permessi per crearne una.');
}
//elimina una directory dal server remoto a partire dalla directory corrente
function eliminaDirectory($dir){
@ftp_rmdir($this->connect, $dir) or die('La directory non esiste o non hai i permessi per eliminarla.');
}
//chiudo la connessione
function close(){
ftp_quit($this->connect) or die("Si è verificato un errore durante la chiusura della connessione al server ftp");
}
//Verifico il tipo di file in base all'estensione
function verificaFile($nomeFile, $tipo){
$ext = explode('.', trim($nomeFile));
$num = count($ext);
if($ext[$num-1]=='jpg' || $ext[$num-1]=='pdf')
if($tipo=='put')
return $this->verifica($nomeFile, $ext[$num-1]);
elseif($tipo=='get')
return $this->verificaLocale($nomeFile, $ext[$num-1]);
}
//funzione che modifica i caratteri speciali e cambia il nome del file se dovesse già esistere sul server
function verifica($nomeFile, $ext){
$nomeFile=stripcslashes($nomeFile);
$nomeFile=str_replace("'"," ",$nomeFile);
$nomeFile=str_replace("`"," ",$nomeFile);
$nomeFile=str_replace("\\"," ",$nomeFile);
$nomeFile=str_replace("&"," ",$nomeFile);
$nomeFile=str_replace("%"," ",$nomeFile);
$nomeFile=str_replace("\""," ",$nomeFile);
$nomeFile=str_replace("à","a",$nomeFile);
$nomeFile=str_replace("è","e",$nomeFile);
$nomeFile=str_replace("é","e",$nomeFile);
$nomeFile=str_replace("ì","i",$nomeFile);
$nomeFile=str_replace("ò","o",$nomeFile);
$nomeFile=str_replace("ù","u",$nomeFile);
if($this->verificaEsistenza($nomeFile)){
$temp=substr($nomeFile, 0, -4);
if($ext=='jpg'){
$nomeFile=$temp.'_.jpg';
}
elseif($ext=='pdf'){
$nomeFile=$temp.'_.pdf';
}
$nomeFile=$this->verifica($nomeFile, $ext);
}
return $nomeFile;
}
/*
Verifico che un file esista già sul server a cui mi collego, la funzione ftp_size restituisce la dimensione del file se trova un file con quel nome nella directory indicata, altrimenti restituisce -1
*/
function verificaEsistenza($file){
$verifica = ftp_size($this->connect, $file);
if($verifica==-1)
return false;
else
return true;
}
//funzione che modifica i caratteri speciali e cambia il nome del file se dovesse già esistere in locale
function verificaLocale($nomeFile, $ext){
if(file_exists($nomeFile)){
$temp=substr($nomeFile, 0, -4);
if($ext=='jpg'){
$nomeFile=$temp.'_.jpg';
}
elseif($ext=='pdf'){
$nomeFile=$temp.'_.pdf';
}
$nomeFile=$this->verificaLocale($nomeFile, $ext);
}
return $nomeFile;
}
}
?>
La classe utilizza le funzioni messe a disposizione da PHP per il trasferimento file utilizzando il protocollo FTP; in aggiunta, ho inserito delle funzioni per la verifica che un file si trovi già sul server (verificaEsistenza()) o, se stiamo prelevando dal server, se il file esiste in locale (verificaLocale()). Non utilizzando tali funzioni i file, se già esistenti, vengono sovrascritti senza alcun output per l’utente.
Inoltre, sono state implementate le funzioni verifica() e verificaFile() che hanno il compito di modificare il nome del file evitando i caratteri speciali e le lettere accentate e, se il file si trova già sul server, modificandone il nome inserendo degli underscore dopo il nome e prima dell’estensione. Naturalmente il bisogna conoscere il tipo di file, infatti la classe è impostata per il trasferimento di file immagini (jpg) e pdf. La classe gestisce questi 2 tipi di file ma è possibile adattarla facilmente per tipi di file qualsiasi in base alle necessità.
Gli unici parametri che vanno inseriti all’interno della classe sono i dati per l’accesso FTP al server remoto, tutto il resto verrà effettuato tramite funzioni d’accesso. Il costruttore simpleFtp() ha il compito di effettuare la connessione al server FTP e la relativa login. Seguono le funzioni principali per l’utilizzo della classe, ovvero trasferisci(), preleva() e cancella(). Tutte queste funzioni leggono il percorso del file sul server FTP a partire dalla root, quindi è necessario inserire il percorso completo al file oppure spostarsi, prima di tali operazioni, sulla directory di lavoro con la funzione cambiaDirectory().
Successivamente sono state implementate altre funzioni molto utili in alcuni ambiti, e sono la funzione cambiaPermessiFile() e rinomina(). La prima serve per modificare i permessi d’accesso al file, ad esempio si può impostare un file con i permessi 0777; la seconda serve per rinominare un fle remoto. Ovviamente, per entrambe le funzioni, si verifica prima se il file sul server esista.
La funzione directoryCorrente() restituisce il percorso della cartella del server su cui si sta lavorando mentre le funzioni creaDirectory() ed eliminaDirectory() sono utilizzate, rispettivamente, per creare ed eliminare cartelle sul server FTP; visualizzaFile(), invece, restituisce un array con la lista dei file presenti nella direcotory passata.
Infine, la funzione close() termina la connessione con il server FTP.
Per rendere maggiormente utilizzabile la classe è possibile modificarne il costruttore in modo da prendere dall’esterno i parametri per la connessione. In altri articoli, se ce ne sarà bisogno, integrerò la classe per l’utilizzo di connessioni cifrate per lo scambio di dati in FTP.
Loading...