Leggere file tramite FTP/TLS

  • Creatore Discussione Creatore Discussione egialma
  • Data di inizio Data di inizio

egialma

Nuovo Utente
3 Ott 2012
29
0
0
Ciao a tutti, ho un piccolo problema.

Fino a due giorni fa funzionava così.

Da una pagina php leggevo un file excel situato su un server remoto tramite FTP con questo semplicissimo codice


PHP:
$File = 'ftp://user:password@Host1/Dir1/file.xls';
if (is_readable($File)) {
.....
.....

leggevo il file e stampavo le informazioni

....
....
}

Poi l'amministratore del server remoto Host1 ha deciso di implementare la funzione SSL/TLS esplicita e per me sono cominciati i guai.

Non riesco più ad accedere al file, sono due giorni che cerco in internet ma non trovo nulla che sia per me comprensibile.

Ho provato con ftps, ma non funziona

Ho provato con ftp_ssl_connection, ma mi esce la dicitura funzione sconosciuta; Ho cercato di capire come attivarla, ma da quello che ho recuperato sembra che sia tutto impostato correttamente o così credo

Ho provato con varie classi come SFTP.php e con FTPCon.php, ma non funzionano: la prima mi da errore, mentre la seconda impalla il web.

Ho provato anche con cURL, ma nulla da fare.

Qualcuno potrebbe aiutarmi, sono aperto a nuove soluzioni o a rivedere le configurazioni già provate.

Grazie mille
 
Hai abilitato il supporto openssl aggiungendo l'estensione nel php.ini?

Cioè
Codice:
extension=php_openssl.dll
 
questo è il messaggio di errore che ricevo usando cURL

Warning: ftp_login(): SSL/TLS required on the control channel in

ho cercato ma sinceramente non so neppure cosa devo cercare
 
Si scusa, ho sbagliato a trascrivere il comando sul forum ma non nel php...
Allora ricapitoliamo:
Hai l'estensione openssl in locale e l'hai inserita correttamente nel php.ini (riavviando eventualmente apache) e la configurazione della connessione è tutta corretta, quindi 'dovrebbe' andare.



Proviamo soluzioni alternative, hai provato ad accedere al file in questo modo, quindi aggiungendo la porta e ftps?
PHP:
$File = "ftps://$user:$password@$server:$porta/Dir1/file.xls";
(non sono sicuro di questo metodo, cioè se si possa fare anche con questo protocollo comunque come dice il gatto saggio al massimo non worka)
 
Grazie per l'interessamento.

Ho provato a riscrivere il comando ftps, nelle prove precedenti, avevo omesso la porta, poiché avevo letto da qualche parte che se la porta era la 21 cioè quella di default si poteva tralasciare.

Comunque riscrivendo il comando come de te indicato, non funzionava, cioè la pagina web si bloccava e rimaneva in clessidra.

Ho provato e forse avrei dovuto farlo prima, creare una pagina ad doc, fino adesso ho tentato di inserire il nuovo codice all'interno del vecchio codice funzionante.


PHP:
        $File = 'ftps://user:password@Host1:21/Dir1/file.xls';
	if (is_readable($File)) {
		echo "connesso";
	}else{
		echo "non connesso";
	}

Con mio stupore è apparsa la scritta "connesso", ma è attendibile?

Poi ho cercato di introdurre il codice per leggere il file excel, nel mio programma funzionante facevo ricorso a phpExcelReader.


PHP:
        date_default_timezone_set('Europe/Rome'); // imposto il time zone
	$Today =(@date('Y-m-d'));
	$FileBaseline = 'ftps://egialma:Ericsson564@94.95.232.83:21/SiteDevNO/NTW&WBS_Baseline.xls';
	if (is_readable($FileBaseline)) {
		echo "connesso";
		echo "<br/>";
		require_once 'class/phpExcelReader/Excel/reader.php'; // Richiamiamo la classe 
		$data = new Spreadsheet_Excel_Reader();
		$data->read($File); // Inseriamo il percorso del file che vogliamo leggere
		$Campo1 = $data->sheets[3]['cells'][1][5];
		$Campo2 = $data->sheets[3]['cells'][1][6]);
		echo "Campo1: ".$Campo1."    Campo2: ".$Campo2;
	}else{
		echo "non connesso";
	}


Ma aggiungendo il codice per la lettura del file si pianta tutto.

Potrebbe essere che tale codice/classe non sia compatibile con il ftps?

Come alternativa ho pensato di copiarmi in locale il file remoto e dopo averlo letto cancellarlo?

Ho provato con copy:

PHP:
	 date_default_timezone_set('Europe/Rome'); // imposto il time zone
	$Today =(@date('Y-m-d'));
	$FileBaseline = 'ftps://egialma:Ericsson564@94.95.232.83:21/SiteDevNO/NTW&WBS_Baseline.xls';
	if (is_readable($FileBaseline)) {
		echo "connesso";
		echo "<br/>";
		copy ( $File, "localdir1/file.xls" );
	}else{
		echo "non connesso";
	}

ma anche in questo caso si pianta tutto e il file non appare nella cartella locale.

Anche in questo caso potrebbe essere che tale codice non sia compatibile con il ftps? Non ho mai usato la funzione copy perciò non so neppure se è corretta come l'ho scritta.

Mi potreste dare altri suggerimenti?

Grazie mille
 
ciao
probailmente devi dare il nome del file che devi copiare e $file non lo vedo da nessuna parte.
copy: http://www.php.net/manual/en/function.copy.php
prova
PHP:
<?php
 date_default_timezone_set('Europe/Rome'); // imposto il time zone
    $Today =date('Y-m-d');//non usare il silent
    $FileBaseline = 'ftps://egialma:Ericsson564@94.95.232.83:21/SiteDevNO/NTW&WBS_Baseline.xls';
    if (is_readable($FileBaseline)) {
        echo "connesso";
        echo "<br/>";
        copy ( $FileBaseline, "localdir1/file.xls" );
    }else{
        echo "non connesso";
    } 
?>
anche se non so, ma probabilmente al posto di "localdir1/file.xls" dovresti dargli qualcosa di simile se vuoi che lo copi sul tuo pc
"C://localdir1/file.xls" o "http://localhost:8080/localdir1/file.xls" o se in un tuo sito "http://www.tuo_sito.it/cartella/file.xls"

p.s.
una solita put... sei sicuro che sia .xls? le ultime versioni di excel hanno .xlsx
 
Allora...

Il file è xls, ho aggiunto il percorso completo di destinazione del file da salvare nel comando copy:


PHP:
	$FileBaseline = 'ftps://erivosti:Nokia238@95.85.22.73:21/AccBBNO/NTW.xls';
	if (is_readable($FileBaseline)) {
		echo "connesso";
		echo "<br/>";
		copy ( $FileBaseline, "http://localhost:81/file/NTW.xls" );
		
	}else{
		echo "non connesso";
	}

e qualcosa in più l'ha fatta, mi è apparsa questa:

connesso

Warning: copy(http://localhost:81/file/NTW.xls): failed to open stream: HTTP wrapper does not support writeable connections in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\prova.php on line 8

Warning: copy(): FTP server error 450:450 Transfer aborted. Link to file server lost in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\prova.php on line 8


la linea 8 del file prova.php è la seguente

PHP:
copy ( $FileBaseline, "http://localhost:81/file/NTW.xls" );
 
Allora...

Il file è xls, ho aggiunto il percorso completo di destinazione del file da salvare nel comando copy:


PHP:
	$FileBaseline = 'ftps://erivosti:Nokia238@95.85.22.73:21/AccBBNO/NTW.xls';
	if (is_readable($FileBaseline)) {
		echo "connesso";
		echo "<br/>";
		copy ( $FileBaseline, "http://localhost:81/file/NTW.xls" );
		
	}else{
		echo "non connesso";
	}

e qualcosa in più l'ha fatta, mi è apparsa questa:

connesso

Warning: copy(http://localhost:81/file/NTW.xls): failed to open stream: HTTP wrapper does not support writeable connections in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\prova.php on line 8

Warning: copy(): FTP server error 450:450 Transfer aborted. Link to file server lost in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\prova.php on line 8


la linea 8 del file prova.php è la seguente

PHP:
copy ( $FileBaseline, "http://localhost:81/file/NTW.xls" );
Hai provato mettendo solo il path locale? Cioè file/NTW.xls
 
Ciao e grazie a tutti per l'interesse....

Per qualche ragione che ignoro ho provato a riutilizzare il codice scritto qualche discussione fa:

PHP:
    date_default_timezone_set('Europe/Rome'); // imposto il time zone 
    $Today =(@date('Y-m-d')); 
    $File = 'ftps://user:password@Host1:21/Dir1/file.xls'; 
    if (is_readable($File)) { 
        echo "connesso"; 
        echo "<br/>"; 
        require_once 'class/phpExcelReader/Excel/reader.php'; // Richiamiamo la classe  
        $data = new Spreadsheet_Excel_Reader(); 
        $data->read($File); // Inseriamo il percorso del file che vogliamo leggere 
        $Campo1 = $data->sheets[3]['cells'][1][5]; 
        $Campo2 = $data->sheets[3]['cells'][1][6]); 
        echo "Campo1: ".$Campo1."    Campo2: ".$Campo2; 
    }else{ 
        echo "non connesso"; 
    }

e questa volta ha funzionato, mi sono apparse a video le informazioni lette nel file remoto.

Ho provato ha inserire il nuovo codice, ovvero

PHP:
  $File = 'ftps://user:password@Host1:21/Dir1/file.xls';

al posto di quello vecchio era

PHP:
  $File = 'ftp://user:password@Host1/Dir1/file.xls';

nel programma che usavo senza problemi da diverse settimane.

Inserendo il nuovo codice si piantava tutto...

Ho cercato di capire quale porzione di codice provocasse il blocco e dopo vari tentativi ho notato che eliminando un else da un blocco if il programma girava.

La porzione di codice per la lettura del file xls remoto è racchiusa tra if e l'else:


PHP:
if ( verifica se leggere il file o se leggere le tabelle) {
    date_default_timezone_set('Europe/Rome'); // imposto il time zone 
    $Today =(@date('Y-m-d')); 
    $File = 'ftps://user:password@Host1:21/Dir1/file.xls'; 
    if (is_readable($File)) { 
        echo "connesso"; 
        echo "<br/>"; 
        require_once 'class/phpExcelReader/Excel/reader.php'; // Richiamiamo la classe  
        $data = new Spreadsheet_Excel_Reader(); 
        $data->read($File); // Inseriamo il percorso del file che vogliamo leggere 
        $Campo1 = $data->sheets[3]['cells'][1][5]; 
        $Campo2 = $data->sheets[3]['cells'][1][6]); 
        echo "Campo1: ".$Campo1."    Campo2: ".$Campo2; 
    }else{ 
        echo "non connesso"; 
    }  
}else{

legge tabelle del db

}

Ho fatto vari tentativi facendo terminare il blocco if prima dell' else e tutto funzionava.

Ho controllato e ricontrollato il blocco dopo l'else ma a me sembrava corretto, anche perchè questa porzione di codice la stavo utilizzando da diverse settimane senza problemi

Senza inserire modifiche ho riattivato il blocco else e con stupore il programma girava.
ho provato diverse volte e tutto funzionava correttamente, mistero.

Ad un certo punto il programma ha smesso di funzionare e si ripiantava, dopo vari tentativi tra cui uscire dal browser e rientrare, si è rimesso a funzionare.

Le condizioni che agiscono sul blocco if sono state sempre le stesse, poiché le varie prove le ho fatte sulla medesima pagina.

Potrebbe essere un problema legato alla connessione SSL/TLS?

L'apertura FTP di un file tramite URL deve essere in qualche modo chiusa? Attualmente il codice non prevede questa funzione e non mi sono posto il problema fino ad ora poichè funzionava tutto, ma adesso mi pongo questo quesito.

Se si, come posso implementare il codice di chiusura?

Grazie a tutti
 

Discussioni simili