PHP e sftp

di il
11 risposte

PHP e sftp

Buongiorno a tutti, sto cercando di far funzionare l'SFTP su PHP ma sto avendo dei problemi.
Ho provato sia con ssh2 che con libsec. Qui sotto potete trovare i codici della pagina

//Versione ssh2
<?php
$host = "192.168.56.101"; //internal network adress
$port = 22;
$username = "guest1";
$password = "****";
$connection = NULL;
$remote_file_path = "/DISEGNI-UPP/prova4.txt"; //where the files it's located the remote file
$local_file_path = "/var/www/html/uploads/prova4.txt"; //absolute path on local machine

try {
    $connection = ssh2_connect($host, $port);
    if(!$connection){
        throw new \Exception("Could not connect to $host on port $port");
    }
    $auth  = ssh2_auth_password($connection, $username, $password);
   if(!$auth){
        throw new \Exception("Could not authenticate with username $username and password ");  
    }
    $sftp = ssh2_sftp($connection);
    if(!$sftp){
        throw new \Exception("Could not initialize SFTP subsystem.");  
    }
    if(ssh2_scp_recv($connection, $remote_file_path, $local_file_path)) {
        echo "File Download Success";
    } else {
        echo "File Download Failed";
    }
    $connection = NULL;
} catch (Exception $e) {
    echo "Error due to :".$e->getMessage();
}
?>
In questo caso mi da l'errore "file download failed"
per quanto riguarda phplibsec il codice è il seguente


<?php
$host = "192.168.56.101"; //internal network adress
$port = 22;
$username = "guest1";
$password = "guest1";
$connection = NULL;
$remote_file_path = "//DISEGNI-UPP/prova4.txt"; //where the files it's located 
$local_file_path = "/var/www/html/uploads/prova4.txt"; //absolute path oon server machine

require ('/usr/share/php/phpseclib/autoload.php');
require('/usr/share/php/phpseclib/Net/SFTP.php');
$sftp = new SFTP('192.168.56.101');
if (!$sftp->login('guest1', 'guest1')) {
    exit('Login Failed');
}

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put($remote_file_path, 'xxx');
//puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put($remote_file_path, $local_file_path, NET_SFTP_LOCAL_FILE);
In questo caso l'errore si verifica sulla dichiarazione

$sftp = new SFTP('192.168.56.101');
Le cartelle hanno i permessi corretti, phplibsec è installato nella directory che vedete sopra.
Usando il comando il get da sftp riesce a fare tutto senza problemi.
Qualcuno ha un'idea su quale potrebbe essere l'errore?
Grazie in anticipo

11 Risposte

  • Re: PHP e sftp

    Ciao!

    neanche a men funziona ssh2_connect, fino a che non ho scoperto che sul server dovevo installare un pacchetto apposito.
    su debian si chiama php-ssh2.
    installato quello e riavviato il servizio, ha funzionato.
    ecco un esempio:
    
    try {
        $conn = ssh2_connect('SERVER', 22);
        ssh2_auth_password($conn, 'USERNAME', 'PASSWORD');
        $sftp = ssh2_sftp($conn);
        $sftpFd = intval($sftp);
        $handle = opendir("ssh2.sftp://$sftpFd/home/UTENTE/");
        while (false != ($entry = readdir($handle))){
            echo "$entry<br>";
        }
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
    
  • Re: PHP e sftp

    Buonasera Fermat e grazie del tuo aiuto
    Per quanto riguarda il tuo consiglio ho provato ad installare il pacchetto che mi hai detto ma in un primo momento sembrava non funzionare. Girando su alcuni siti internet sembra che il problema sia nei caratteri '/' singoli
    ho usato questo codice
    
    host = '192.168.56.101';
    $port = 22;
    $username = 'guest1';
    $password = '*****';
    $remoteDir = '//DISEGNI-UPP//';
    $localDir = '//var//www//html//uploads//';
    
    if (!function_exists("ssh2_connect"))
        die('Function ssh2_connect not found, you cannot use ssh2 here');
    
    if (!$connection = ssh2_connect($host, $port))
        die('Unable to connect');
    
    if (!ssh2_auth_password($connection, $username, $password))
        die('Unable to authenticate.');
    
    if (!$stream = ssh2_sftp($connection))
        die('Unable to create a stream.');
    
    if (!$dir = opendir("ssh2.sftp://{$stream}{$remoteDir}"))
        die('Could not open the directory');
    
    $files = array();
    while (false !== ($file = readdir($dir)))
    {
        if ($file == "." || $file == "..")
            continue;
        $files[] = $file;
    }
    
    foreach ($files as $file)
    {
        echo "Copying file: $file\n";
        if (!$remote = @fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}", 'r'))
        {
            echo "Unable to open remote file: $file\n";
            continue;
        }
    
        if (!$local = @fopen($localDir . $file, 'w'))
        {
            echo "Unable to create local file: $file\n";
            continue;
        }
    
        $read = 0;
        $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}");
        while ($read < $filesize && ($buffer = fread($remote, $filesize - $read)))
        {
            $read += strlen($buffer);
            if (fwrite($local, $buffer) === FALSE)
            {
                echo "Unable to write to local file: $file\n";
                break;
            }
        }
        fclose($local);
        fclose($remote);
    }
    
    mettendoli singoli non mi prende l'indirizzo di rete, mettendoli doppi riesco a scaricare tutto il contenuto senza problemi. Non ho capito il perché ma va bene cosi.
    Ora sto cercando di modificare lo script in modo che scarichi solo 1 file ma mi da dei problemi. Magari puoi aiutarmi;
    se trasformo i codice come segue ottengo degli errori ma non capisco il perché:
    
    host = '192.168.56.101';
    $port = 22;
    $username = 'guest1';
    $password = '*****';
    $remoteDir = '//DISEGNI-UPP//';
    $localDir = '//var//www//html//uploads//';
    
    if (!function_exists("ssh2_connect"))
        die('Function ssh2_connect not found, you cannot use ssh2 here');
    
    if (!$connection = ssh2_connect($host, $port))
        die('Unable to connect');
    
    if (!ssh2_auth_password($connection, $username, $password))
        die('Unable to authenticate.');
    
    if (!$stream = ssh2_sftp($connection))
        die('Unable to create a stream.');
    
    // eliminata in quanto so che la directory esiste 
    //if (!$dir = opendir("ssh2.sftp://{$stream}{$remoteDir}"))
    //    die('Could not open the directory');
    //
    $file = [variabile passata da DB];
    //while (false !== ($file = readdir($dir)))
    //{
    //   if ($file == "." || $file == "..")
    //       continue;
    //    $files[] = $file;
    //}
    
    //foreach ($files as $file)
    //{
        echo "Copying file: $file\n";
    
        // eliminata in quanto il file so che eiste poichè legato all'iserimento record in DB
        //if (!$remote = @fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}", 'r'))
        //{
        //    echo "Unable to open remote file: $file\n";
        //    continue;
        //}
       // eliminata in quanto la directory è una directory creata a doc
        //if (!$local = @fopen($localDir . $file, 'w'))
        //{
        //    echo "Unable to create local file: $file\n";
        //    continue;
       // }
    
        $read = 0;
        $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}");
        while ($read < $filesize && ($buffer = fread($remote, $filesize - $read)))
        {
            $read += strlen($buffer);
            if (fwrite($local, $buffer) === FALSE)
            {
                echo "Unable to write to local file: $file\n";
                break;
            }
        }
        fclose($local);
        fclose($remote);
    //}
    
    Grazie in anticipo per la tua risposta
    Saluti
  • Re: PHP e sftp

    Ciao!

    dove si intoppa di preciso?

    cmq forse un errore già sta qua:
    
    $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}");
    
    mi verrebbe da dire che manca uno slash:
    
    $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}/{$file}");
    
    ma ho dato uno sguardo veloce....

    per quanto riguarda gli slash nei percorsi, non l'avevo mai sentita.
    hai dato un'occhiata agli esempi della documentazione ufficiale??
  • Re: PHP e sftp

    $remoteDir possiede slash iniziali e finali, c'è uno slash in più dopo $stream.
    Sono alquanto curioso sul discorso del doppio slash. Modifica la variabile $remote codice1 e $filesize codice1 e codice2.
    Comunque sul manuale forza ssh2_sftp a essere un intero con la funzione intval().
    Distinti saluti.
  • Re: PHP e sftp

    Buonasera Fermat e Hormus.
    grazie per le Vs risposte. Per quanto riguarda lo script e i doppi apici penso che sia una cosa dovuta al fatto che lo script copi i dati da un server di rete A e lo depositi su server di rete B con indirizzi diversi mentre lo script viene eseguito si sul server B ma da una client con indirizzo C diverso da A e B.
    Per spiegarla in maniera semplice il sistema serve a preparare i pacchetti zip con all'interno i tutti i documenti della commessa e li rende disponibili al download su un server a cui hanno accesso anche esterni. Il ns scopo è quello di rendere disponibile solo i documenti strettamente necessari. Questa è solo una delle routine che compongono lo script in se. Nel caso posterò anche il resto del codice che per ora è in fase molto embrionale e che coinvolge anche mysql e autocad.
    lo script che sto modificando ( che copia tuta la directory) l'ho trovato su internet. Il blocco avviente quando commento quanto segue:
    
    $files = array();
    while (false !== ($file = readdir($dir)))
    {
        if ($file == "." || $file == "..")
            continue;
        $files[] = $file;
    }
    
    foreach ($files as $file)
    {
        echo "Copying file: $file\n";
        if (!$remote = @fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}", 'r'))
        {
            echo "Unable to open remote file: $file\n";
            continue;
        }
    
        if (!$local = @fopen($localDir . $file, 'w'))
        {
            echo "Unable to create local file: $file\n";
            continue;
        }
    
        $read = 0;
        $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}");
        while ($read < $filesize && ($buffer = fread($remote, $filesize - $read)))
        {
            $read += strlen($buffer);
            if (fwrite($local, $buffer) === FALSE)
            {
                echo "Unable to write to local file: $file\n";
                break;
            }
        }
        fclose($local);
        fclose($remote);
    }
    
    La versione qui sopra copia perfettamente tutta la directory dal server A al server B
    Quando apporto queste modifiche qui sotto
    
    $file=[variabile passata dal db contenente il nome del file da scaricare copreso di estensione];
    //$files = array();
    //while (false !== ($file = readdir($dir)))
    //{
    //    if ($file == "." || $file == "..")
    //        continue;
    //    $files[] = $file;
    //}
    
    //foreach ($files as $file)
    //{
        echo "Copying file: $file\n";
        if (!$remote = @fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}", 'r'))
        {
            echo "Unable to open remote file: $file\n";
            continue;
        }
    
        if (!$local = @fopen($localDir . $file, 'w'))
        {
            echo "Unable to create local file: $file\n";
            continue;
        }
    
        $read = 0;
        $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}");
        while ($read < $filesize && ($buffer = fread($remote, $filesize - $read)))
        {
            $read += strlen($buffer);
            if (fwrite($local, $buffer) === FALSE)
            {
                echo "Unable to write to local file: $file\n";
                break;
            }
        }
        fclose($local);
        fclose($remote);
    //}
    
    Lo script dovrebbe funzionare correttamente ( ho semplicemente escluso il ciclo foreach, e passo come $file un paramentro ben preciso preso dal DB)
    la pagina si blocca e mi da errore 500
    Non riesco a capire dove stia l'errore
    Grazie in anticipo per il VS aiuto
  • Re: PHP e sftp

    É assai probabile che per qualche motivo il file non viene trovato.
    Normalmente gli errori PHP vengono archiaviti dal log di apache, se non hai abilitato gli errori documentati su come fare e attiva anche gli errori display e altro. (Questo va bene su un'ambiente di sviluppo "non destinato a essere pubblico").
    Comunque dal momento che usi i percorsi relativi perché non usi percorsi assoluti?
    Semplicemente perché il codice funziona non vuol dire che sia scritto in maniera corretta.
    Se il server non riesce a trovare il percorso tramite wrapper (ssh2.sftp://) si aggiunge uno slash iniziale per il wrapper e uno normale. (Se il bug é nel wrapper).
    $remoteDir = '/var/www/html/DISEGNI-UPP/';
    if (!$remote = @fopen('ssh2.sftp://'.intval($stream)."/{$remoteDir}{$file}", "r"))
    // ho forzato $stream in intero e inserito uno slash nel wrapper
    altrimenti $stream é Resource id.
    Il mode di fopen può essere solamente racchiuso da apici doppi mai apici singoli.
    beh per calcolare la docroot in un file situato nella root si può utilizzare $my_root = dirname(__FILE__).'/'; // /var/www/html/
    Il carattere chiocciola anteposto in una funzione non mostra gli avvertimenti che normalmente una funzione produce nel caso che qualcosa vada storto.
    Mi dispiace nel non fornirti il codice per intero.
    Comunque con errori e la visualizzazione display potrai leggere cosa realmente non va.
  • Re: PHP e sftp

    Buonasera Hormus
    sembra che alla fine la cosa si è risolta, grazie alla info riguardante la @ messa davanti al nome funzione è stata illuminante.L'ho rimossa e magicamente il file error.log mi ha dato le info di cui avevo bisogno
    
    [Thu Jun 13 22:09:54.115414 2019] [php7:notice] [pid 1489] [client 192.168.56.1:2083] PHP Notice:  Array to string conversion in /var/www/html/prova.php on line 26
    [Thu Jun 13 22:12:20.087884 2019] [php7:notice] [pid 1488] [client 192.168.56.1:2094] PHP Notice:  Array to string conversion in /var/www/html/prova.php on line 26
    [Thu Jun 13 22:13:09.041757 2019] [php7:error] [pid 1491] [client 192.168.56.1:2100] PHP Fatal error:  'continue' not in the 'loop' or 'switch' context in /var/www/html/prova.php on line 31
    [Thu Jun 13 22:13:18.776424 2019] [php7:error] [pid 1487] [client 192.168.56.1:2101] PHP Fatal error:  'continue' not in the 'loop' or 'switch' context in /var/www/html/prova.php on line 31
    
    le righe incriminate erano le seguenti:
    riga 26
    
     echo "Copying file: $file_SFTP<br>";
    
    riga 31
    
    continue;
    
    ho modificato lo script come segue ed ora copia il singolo file senza problemi
    
    <?php
    $host_SFTP = '192.168.56.101';
    $port_SFTP = 22;
    $username_sftp = 'guest1';
    $pass_sftp = '******';
    $remotedir_SFTP = '//DISEGNI-UPP//';
    $localdir_SFTP = '//var//www//html//uploads//';
    $file_SFTP= [nomefile passato da DB];
    if (!function_exists("ssh2_connect"))
        die('Function ssh2_connect not found, you cannot use ssh2 here');
    if (!$connection = ssh2_connect($host_SFTP, $port_SFTP))
        die('Unable to connect');
    if (!ssh2_auth_password($connection, $username_sftp, $pass_sftp))
        die('Unable to authenticate.');
    if (!$stream = ssh2_sftp($connection))
        die('Unable to create a stream.');
    if (!$dir = opendir("ssh2.sftp://{$stream}{$remotedir_SFTP}"))
        die('Could not open the directory');
    
    if (!$remote = fopen("ssh2.sftp://{$stream}/{$remotedir_SFTP}{$file_SFTP}", 'r'))
        {
            echo "Unable to open remote file: $file_SFTP\n";
           //valutare un break nel caso di errore
        }
        if (!$local = fopen($localdir_SFTP . $file_SFTP, 'w'))
        {
            echo "Unable to create local file: $file_SFTP\n";
           //valutare un break nel caso di errore
        }
        $read = 0;
        $filesize = filesize("ssh2.sftp://{$stream}/{$remotedir_SFTP}{$file_SFTP}");
        while ($read < $filesize && ($buffer = fread($remote, $filesize - $read)))
        {
            $read += strlen($buffer);
    		fwrite($local, $buffer);
        }
        fclose($local);
        fclose($remote);
    ?>
    
    ora Il prossimo passo in cui mi diletterò sarà l'integrazione nella funzione di estrazione da DB. Nel caso avrò delle difficoltà chiederò di nuovo il vs aiuto.
    Al momento l'ottimizzazione del codice non è la priorità. Al momento serve che riusciamo ad avere uno script funzionante per i ns fornitori. Durante la fermata di Agosto ottimizzeremo i codici per renderli piu eleganti e meno dispersivi.
    Devo a te e a fermat qualche birra
    Buona serata
  • Re: PHP e sftp

    Sono contento che hai risolto, il costrutto echo é applicato su stringhe e se vuoi stampare un array $file_SFTP = ["foo" => "test", "bar" => "test2",];
    Devi chiamare l'array con la propria key.
    echo $file_SFTP["foo"]; // o $file_SFTP["bar"]
    Ma nel codice che proponi echo verrà utilizzato quando $local é false dunque fallisce $local = fopen('/absolute/local/path/to/file.txt', "w"); anche qui l'array deve essere con key.
    Dunque devi utilizzare il ciclo foreach anche se l'array contiene un solo elemento. [CODE]<?php $host_SFTP = '192.168.56.101'; $port_SFTP = 22; $username_sftp = 'guest1'; $pass_sftp = '******'; $remotedir_SFTP = '/full/absolute/locale/path/DISEGNI-UPP/'; $localdir_SFTP = '/var/www/html/uploads/'; $file_SFTP= [nomefile passato da DB]; if (!function_exists("ssh2_connect")) die('Function ssh2_connect not found, you cannot use ssh2 here'); if (!$connection = ssh2_connect($host_SFTP, $port_SFTP)) die('Unable to connect'); if (!ssh2_auth_password($connection, $username_sftp, $pass_sftp)) die('Unable to authenticate.'); if (!$stream = ssh2_sftp($connection)) die('Unable to create a stream.'); if (!$dir = opendir('ssh2.sftp://'.intval($stream)."{$remotedir_SFTP}")) die('Could not open the directory'); foreach($file_SFTP as $file){ if (!$remote = fopen('ssh2.sftp://'.intval($stream)."{$remotedir_SFTP}{$file}", "r")) { echo "Unable to open remote file: $file\n"; continue; } if (!$local = fopen($localdir_SFTP . $file, "w")) { echo "Unable to create local file: $file\n"; continue; } $read = 0; $filesize = filesize('ssh2.sftp://'.intval($stream)."{$remotedir_SFTP}{$file}"); while ($read < $filesize && ($buffer = fread($remote, $filesize - $read))) { $read += strlen($buffer); fwrite($local, $buffer); } fclose($local); fclose($remote); } Ho aggiunto un percorso assoluto in $remotedir_SFTP e tolto gli slash in più nelle variabili e nel wrapper altrimenti aggiungi un singolo slash dopo intval($stream)."/ in $remote , $local e $filesize.. Gentilmente se ti va di provare e postare esattamente l'errore generato sarebbe molto utile.
    Mentre continue (continua il loop a differenza di break esci dal loop) si usa nel contesto dei loop e mi era sfuggito.
    Ciao non esitare tienici aggiornati.
  • Re: PHP e sftp

    Buonasera Hormus,
    ho provato a far girare il codice come da te modificato ed ecco il risultato
    
    [Fri Jun 28 22:54:01.656266 2019] [php7:warn] [pid 1423] [client 192.168.56.1:3228] PHP Warning:  opendir(): Unable to open ssh2.sftp://3/TECNICO/DISEGNI-UPP/ on remote host in /var/www/html/prova.php on line 17
    [Fri Jun 28 22:54:01.656302 2019] [php7:warn] [pid 1423] [client 192.168.56.1:3228] PHP Warning:  opendir(ssh2.sftp://3/TECNICO/DISEGNI-UPP/): failed to open dir: operation failed in /var/www/html/prova.php on line 17
    [Fri Jun 28 22:54:20.419735 2019] [php7:warn] [pid 1422] [client 192.168.56.1:3231] PHP Warning:  opendir(): Unable to open ssh2.sftp://2/TECNICO/DISEGNI-UPP/ on remote host in /var/www/html/prova.php on line 17
    [Fri Jun 28 22:54:20.419766 2019] [php7:warn] [pid 1422] [client 192.168.56.1:3231] PHP Warning:  opendir(ssh2.sftp://2/TECNICO/DISEGNI-UPP/): failed to open dir: operation failed in /var/www/html/prova.php on line 17
    [Fri Jun 28 22:55:26.679769 2019] [php7:warn] [pid 1421] [client 192.168.56.1:3244] PHP Warning:  opendir(): Unable to open ssh2.sftp://3/TECNICO/DISEGNI-UPP/ on remote host in /var/www/html/prova.php on line 17
    [Fri Jun 28 22:55:26.679837 2019] [php7:warn] [pid 1421] [client 192.168.56.1:3244] PHP Warning:  opendir(ssh2.sftp://3/TECNICO/DISEGNI-UPP/): failed to open dir: operation failed in /var/www/html/prova.php on line 17
    
    è come se non trovasse la directory
    A disposizione
  • Re: PHP e sftp

    Ciao buon sabato a tutti, é un bug noto quando usi il wrapper.. In questo caso il tuo wrapper é ssh2.sftp://.
    Prova i seguenti passi
    1)Aggiungi il percorso assoluto non /TECNICO/DISEGNI-UPP/ in un qualcosa del genere /var/www/html/TECNICO/DISEGNI-UPP/ ovviamente in questo esempio /var/www/html/ dovrebbe essere la document root se é diversa inserisci quella corretta
    2) Se ancora leggi lo stesso errore aggiungi uno slash direttamente nel wrapper ma non nella variabile 'ssh2.sftp://'.intval($stream)."/{$remotedir_SFTP}"; saranno interessate le tre variabili $dir, $remote e $filesize cioè che finisca con slash dopo $stream, credo che il wrapper non riesce a trovare la posizione corretta perché non esplichi la posizione assoluta la stessa cosa capita anche con la funzione include quando senza percorso assoluto.
    A tal proposito creo una nuova variabile che contiene il refirimento di ssh2.sftp://numerointero che sarà usata come parte iniziale in tutto il programma
    <?php
    $host_SFTP = '192.168.56.101';
    $port_SFTP = 22;
    $username_sftp = 'guest1';
    $pass_sftp = '******';
    $remotedir_SFTP = '/full/absolute/locale/path/DISEGNI-UPP/';
    $localdir_SFTP = '/var/www/html/uploads/';
    $file_SFTP= [nomefile passato da DB];
    if (!function_exists("ssh2_connect"))
        die('Function ssh2_connect not found, you cannot use ssh2 here');
    if (!$connection = ssh2_connect($host_SFTP, $port_SFTP))
        die('Unable to connect');
    if (!ssh2_auth_password($connection, $username_sftp, $pass_sftp))
        die('Unable to authenticate.');
    if (!$stream = ssh2_sftp($connection))
        die('Unable to create a stream.');
    //modifico da qui in poi
    //leggimi se riscontri ancora errori non dimenticare di aggiungere uno slash a $wra_ssh2
    //"{$wra_ssh2}/ con slash finale dopo la parentesi graffa di chiusura
    $wra_ssh2 = 'ssh2.sftp://'.intval($stream);
    if (!$dir = opendir("{$wra_ssh2}{$remotedir_SFTP}"))
        die('Could not open the directory');
    
    foreach($file_SFTP as $file){
    if (!$remote = fopen("{$wra_ssh2}{$remotedir_SFTP}{$file}", "r"))
        {
            echo "Unable to open remote file: $file\n";
           continue;
        }
    if (!$local = fopen($localdir_SFTP . $file, "w"))
        {
            echo "Unable to create local file: $file\n";
           continue;
        }
    $read = 0;
        $filesize = filesize("{$wra_ssh2}{$remotedir_SFTP}{$file}");
    //fine modifica, aggiungi uno slash dopo $wra_ssh2 se riscontri ancora errori
    //$dir, $remote e $filesize potrebbero contenere uno slash in più se ovviamente é aggiunto manualmente in $wra_ssh2
        while ($read < $filesize && ($buffer = fread($remote, $filesize - $read)))
        {
            $read += strlen($buffer);
    		fwrite($local, $buffer);
        }
        fclose($local);
        fclose($remote);
     }
    Aspetto tue notizie.
  • Re: PHP e sftp

    Ciao Hormus,
    grazie per le informazioni sul wrapper, non sapevo di questo bug.
    Per quanto riguarda la directory dove sono salvati i disegni il percorso completo è proprio /Tecnico/Disegni-UPP/ si tratta di una macchina virtuale che emula il NAS dell'ufficio. Per ora tutto il codice gira su ambiente di test. Su questo ambiente ho settato sia il server sftp che SAMBA per la condivisione dei files. Al momento, essendo da solo e seguendo anche l'ufficio acquisti, sono indietro come le @@ del cane. Al momento mi sto occupando delle distinte e le ricerche, appena finisco i test e ho un attimo di respiro devo trovare il tempo per settare il server sftp sul nas, trasferire lo script sul server e vedere che giri.
    Per darti un'idea dell'utilizzo del codice eccoti lo script completo che include anche l'estrazione
    
    <?php
    $padre=$_GET['combo1']; //parametro da pagina precedente
    $estensione =".PDF"; //verrà spostato nel file della configurazione
    $archivia = new ZipArchive();
    $nome_file = $padre . ".zip";
    $dir_file="./downloads/".$nome_file; //verrà spostato nel file della configurazione
    $rimuovi='\\\\fileserver\nas\DISEGNI-UPP\\'; //verrà spostato nel file della configurazione
    if ($archivia->open($dir_file, ZIPARCHIVE::CREATE)!==TRUE) 
    {
      exit("Impossibile aprire <$nome_file>\n");
    }
    //  blocco dei parametri di connessione
    require_once('database.php'); //connessione al DB
    //  fine blocco parametri connessione
    
    //
      //blocco try/catch di gestione delle eccezioni
    //
    try {
      // stringa di connessione al DBMS
      $connessione = new PDO("mysql:host=$host;dbname=$db", $user, $password);
      // imposto dell'attributo necessario per ottenere il report degli errori
      $connessione->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // selezione e visualizzazione dei dati estratti
      foreach ($connessione->query("SELECT art.PATHNAME_IMMAGINE FROM dsb join art on art.codice = dsb.ART_CODICE_FIGLIO where art_codice_padre = '$padre' and art.PATHNAME_IMMAGINE !=''") as $row) //da configurare il PDO correttamente
      {
    	$file_to_download= $row['PATHNAME_IMMAGINE'];
    	$file_to_download=str_replace($rimuovi,"",$file_to_download);
    	estrai($file_to_download);
    	$archivia->addFile('./downloads/'.$file_to_download,$file_to_download);
      }
      // chiusura della connessione
      $connessione = null;
    }
    catch(PDOException $e)
    {
      // notifica in caso di errore nel tentativo di connessione
      echo $e->getMessage();
    }
    estrai($padre.$estensione);
    estrai($padre."_BOM".$estensione);
    //SCRIVE IL FILE D'ASSIEME E IL FILE DELLA BOM NELL'ARCHIVIO, NEL CASO DI VARIANTI IL PROGRAMMA PRENDE IL FILE CONTENENTE LA VARIANTE
    $conta=explode('-',$padre);
    if (count($conta)==3){
    	$nuovo=$conta[0].'-'.$conta[2];
    	$archivia->addFile('./downloads/'.$nuovo.$estensione,$nuovo.$estensione);
    	$archivia->addFile('./downloads/'.$nuovo.'_BOM'.$estensione,$nuovo.'_BOM'.$estensione);
    } else {
            $archivia->addFile('./downloads/'.$padre.$estensione,$padre.$estensione);
            $archivia->addFile('./downloads/'.$padre.'_BOM'.$estensione,$padre.'_BOM'.$estensione);
    }
    //CHIUDE IL FILE
    $archivia->close();
    unlink('./downloads/'.$padre.'_BOM'.$estensione);
    unlink('./downloads/'.$padre.'$estensione');
    chmod ($dir_file,0777);
    $percorso= $_SERVER['SERVER_NAME'].'/downloads/'.$nome_file;
    
    
    function estrai($file){
    include('sftp.php');
    $connection = ssh2_connect($host, $port);
    ssh2_auth_password($connection, $username, $password);
    $stream = ssh2_sftp($connection);
    $files = array(); //rivedere assegnazione
    $files[0] = $file;
    
    foreach ($files as $file)
    {
        echo "Copia del file: $file <br>";
        $remote = fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}", 'r');
        $local = fopen($localDir . $file, 'w');
        $read = 0;
        $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}");
        while ($read < $filesize && ($buffer = fread($remote, $filesize - $read)))
        {
            $read += strlen($buffer);
            fwrite($local, $buffer);
        }
        fclose($local);
        fclose($remote);
        echo "Copia eseguita con successo <br>";
    	$connection = null;
    }
    }
    ?>
    SCARICA L'ARCHIVIO DELL'ASSIEME <a href="http://<?php echo $percorso;?>"><?php echo $padre;?></a><br>
    <a href="//<?php echo $_SERVER["SERVER_NAME"].'/distintabase.php';?>">Ritorna alla pagina delle distinte</a> <br>
    
    Ti terrò informato
Devi accedere o registrarti per scrivere nel forum
11 risposte