IMC!


Contenuti


Foto

 







Curiosando...
Novita  Novità Link  Link Blog  Blog English  Español 
Elenco di file in remoto con link

Supponiamo di avere questa situazione:
  • Computer A: contiene delle directory delle quali vogliamo conoscere il contenuto. Vogliamo anche che i file contenuti in queste directory siano ragiungibili tramite un link.

  • Computer B: vogliamo visualizzare su questo computer l'elenco dei file contenuti nel computer A, e scaricarli tramite il relativo link.

    NOTA BENE: vogliamo ottenere solo l'elenco dei file, non una pagina web intera. In questo modo possiamo inserire o modificare l'elenco come meglio crediamo.
Si tratta, in sostanza, di ottenere l'elenco di file in remoto. La soluzione non � banale, soprattutto se tra i due computer si pone la rete internet pubblica, visto che PHP non offre funzioni apposite. Qu� di seguito propongo due soluzioni in PHP.

Attenzione: Gli script presentati utilizzano delle immagini, che devono essere nella cartella foto. Potete scaricare il pacchetto completo qu�: foto.rar

Soluzione 1: uso di un server FTP
Per questa soluzione sono necessari:
  1. Server FTP sul computer A.
  2. Server HTTP sul computer A
  3. PHP sul computer B
L'idea, per questa soluzione, � di avere un server FTP e un server HTTP sul computer A con radice coincidente, in modo che i percorsi siano gli stessi. Il computer B ottiene l'elenco dei file presenti sul computer A tramite il protocollo FTP. La gestione del protocollo FTP, l'interpetazione dei dati e la pubblicazione avviene tramite il PHP, con lo script seguente, che deve essere eseguito sul computer B.

NOTA BENE: Questo script richiede l'elenco dei file al server FTP, e poi li interpreta per estrapolare nomi, dimensioni, date. In base al tipo di server, potrebbe essere necessario adattare la sezione di interpretazione dei dati. Inoltre crea dei link ai file supponendo che la radice del server FTP e del server HTTP coincidano.

Codice di elenco_ftp.php
<?PHP
# Copyright: Isacco Coccato - www.giacobbe85.altervista.org

# Questo script si connette a un server ftp, e visualizza, con link, i file e le cartelle sul server.
# Presuppone quindi l'esistenza di un server HTTP e un server FTP.
# Probabilmente non funzioner� subito, perch� alcune parti, come l'interpretazione dei dati inviati
# dal server FTP, dipendono dal tipo di server FTP e HTTP.
# E' impostato per funzionare con webserver Apache e FTP Server FileZilla, con radice dei documenti coincidente.
# Probabilmente, perch� funzioni, sar� necessario modificare la parte relativa all'interpretazione dei dati FTP.

### ELENCO FILE DA SERVER REMOTO FTP ###    
$ftp_server 'iltuoserver.org' ;
$ftp_port 21;
$ftp_user 'nome_utente_ftp';
$ftp_pass 'password_ftp';

function 
elenco_dir($ftp$base$ftp_server)
{
  
# $ftp: un puntatore a un flusso FTP
    # $base: il percorso della cartella di cui si vuol visualizzare il contenuto
    # $ftp_serve: l'indirizzo del server FTP
    
  # Legge il contenuto della directory corrente in forma grezza, e lo pone in un array di array. 
    # Il primo indice indica ciascun file.
    # Il secondo indice indica, di ciascun file: dimensione, data, nome.
  
$elenco=ftp_rawlist($ftp$base);
  if (
$elenco!=null#Verifica che non sia stata letta una directory vuota
  
{
      
#Interpretazione della RAWLIST. Va modificata in base al tipo di server FTP
    
foreach($elenco as $indice => $elemento
    {
      
# Legge le singole informazioni
      
$dimensione_file=substr($elemento2114);
      
$data_file=substr($elemento3612);
      
$nome_file=substr($elemento49);
 
      
# Inserice i dati nella matrice complessiva
         
$tutto_file[$indice][0]=$dimensione_file;
      
$tutto_file[$indice][1]=$data_file;
      
$tutto_file[$indice][2]=$nome_file;
    }
    
# Formattazione e stampa del testo    
    
echo "<UL style=\"font-family: verdana; font-size: 12px\">\n"
    foreach (
$tutto_file as $file_corrente)
    {
      if (
$file_corrente[0]=='0'
        {
          
# Codice nel caso di directory
          
echo '<LI style="list-style-image: url(foto/cartella.gif)"><B>' $file_corrente[2] . "</B>\n";
          
elenco_dir($ftp$base"/" .$file_corrente[2], $ftp_server); 
              echo 
"</LI>\n";
        }
        else
        {
          
#Codice nel caso di file
          
echo '<LI style="list-style-image: url(foto/file.gif)"><A href="http://' $ftp_server '/' $base '/' $file_corrente[2] . '">' $file_corrente[2]  . "</A> (" round($file_corrente[0]/10000002) . " Mb)</LI>\n";
      }
    }
    echo 
"</UL>";
  } 
    else 
#Stampa la mancanza di file
    
{
      echo 
'<UL><LI class="testo" style="list-style-image: url(foto/sbagliato.gif)">Nessun file presente</LI></UL>';
    }
}

## CODICE DI ESEMPIO DI UTILIZZO
# Crea la connessione
$ftp = @ftp_connect($ftp_server$ftp_port);

if(
$ftp# Caso in cui la connessione sia stata stabilita
{
  if(@
ftp_login($ftp$ftp_user$ftp_pass)) # Autenticazione avvenuta
  
{
    
elenco_dir($ftp'.'$ftp_server); # NON mettere la barra alla fine
  
}
  else 
# Autenticazione fallita
  
{
    echo 
'<DIV style="font-family: verdana; font-size: 12px" align="center"><BR>';
      echo 
'<IMG src="foto/errore.gif" height="31" width="26" alt="Utente errato"><BR>';
      echo 
'Autenticazione al server fallita</DIV>';
  }
  
ftp_close($ftp);
}
else 
# Caso in cui la connessione non sia stata stabilita
{
  echo 
'<DIV style="font-family: verdana; font-size: 12px" align="center"><BR>';
    echo 
'<IMG src="foto/zzz.gif" height="32" width="30" alt="Zzz.."><BR>';
    echo 
'Il server non ï¿½ raggiungibile.<BR>Probabilmente ï¿½ spento.</DIV>';
}
?>


Soluzione 2: uso di cURL
Per questa soluzione sono necessari:
  1. PHP sul computer A.
  2. Server HTTP sul computer A
  3. PHP sul computer B
L'idea, per questa soluzione, � di creare l'elenco dei file direttamente sul computer A, tramite PHP, ad esempio con la funzione elenca_dir, della quale parlo in un altro articolo di questa sezione, e che riporto sotto per comodit�. Il computer B richiede l'elenco dei file al computer A tramite l'estensione libcurl (di cui ho gi� parlato in un altro articolo).

Il codice PHP seguente deve essere memorizzato e eseguito sul computer A. Crea un elenco ordinato di file. Deve essere memorizzato in una cartella pubblica del server HTTP, in modo da poter essere richiamato tramite cURL dal computer B:

Codice di elenco_dir.php
<?PHP
# Questa funzione permette di visualizzare un elenco a albero dei file e delle sottocartelle contenuti in $base.
# Ciascun nome visualizzato ï¿½ un link al file.
# Copyright: Isacco Coccato - www.giacobbe85.altervista.org

# NOTE:
# - Quando si specifica il percorso, NON mettere / alla fine.
# - Le immagini dei file e delle cartelle devono essere nella directory foto/

function elenco_dir($base)
{
$dir_vuota=1# Flag per il controllo della directory vuota
if ($handle_dir opendir($base)) # Apre la directory, e verifica che il percorso sia corretto
{
    echo 
"<UL class=\"testo\">\n"
  while (
false!==($dir readdir($handle_dir))) # Legge una voce del finch� non ï¿½ finita la directory, e la memorizza in $dir
  
{
    if (
$dir!="." && $dir!=".."#Evita di stampare "." e ".."
    
{
      
$dir_vuota=0;
          if(
is_dir($base"/" .$dir))
          {
           
# Codice nel caso di directory
          
echo '<LI style="list-style-image: url(foto/cartella.gif)"><B>' $dir "</B>\n";
          
elenco_dir($base"/" .$dir); 
               echo 
"</LI>\n";
      }
       else
        {
          
#Codice nel caso di file
            # Evita di stampare alcuni tipi di file
                # Elimina l'estensione dei file, qualunque sia la sua lunghezza, e anche se compaiono altri punti nel nome del file
              
if ($dir != "." && $dir != ".." && $dir != "file_da_non_mostrare.est" && substr($dir,-3,3) != "estensione_da_non_mostrare")
        {
                   echo 
'<LI style="list-style-image: url(foto/file.gif)"><A href="' .$base '/' $dir '">' str_replace('_'' 'substr($dir,0strrpos($dir,"."))) . "</A></LI>\n";
              }
      }
    }
  }
    if (
$dir_vuota==1) echo '<LI class="testo" style="list-style-image: url(foto/sbagliato.gif)">Nessun file presente</LI>';    
  echo 
"</UL><BR>";    
  
closedir($handle_dir);
}
else 
#Codice nel caso di percorso non trovato
{
  echo 
"Percorso errato";
}
}    

# Chiamata della funzione come esempio
elenco_dir(".");
?>

Il codice PHP seguente deve essere memorizzato e eseguito sul computer B. Richiama tramite libcurl l'elenco creato sul computer A. Presuppone che tale elenco sia in una cartella pubblica del server HTTP del computer A:

Codice di curl.php
<?php

# Questo script chiama una pagina dal web come se fosse un browser, 
# e poi la immagazzina in una variabile

# Indirizzo della pagina da richiamare
$indirizzo_pagina="www.giacobbe85.altervista.org";

# Codice di utilizzo di cURL. 
# Chiama la pagina e la immagazzina in $data
$ch curl_init() or die(curl_error());
curl_setopt($chCURLOPT_URL,$indirizzo_pagina);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
$data=curl_exec($ch) or die(curl_error());

# Stampa della variabile $data. 
echo $data;

# Stampa di eventuali errori
echo curl_error($ch);
curl_close($ch);
?>






Fatal error: Call to undefined function sqlite_open() in /membri/giacobbe85/include/commenti.inc.php on line 324