Avatar billede lubker Nybegynder
27. marts 2008 - 12:29 Der er 6 kommentarer og
2 løsninger

ftp_get ved flere filer

Hej.
Jeg sidder og leget lidt med php's ftp funktionalitet og er stødt ind i et problem.

Jeg har 2 servere stående, hvor jeg ønsker at overføre filer imellem med et php script.
På den "server1" ligger en liste over filer der skal overføres til "server2".

Ved et phpscript på "server2" skal den hente denne fil og åbne den. (hvilket virker fint nok)
Problemet kommer så når jeg videre skal hente alle de filer der ligger i listen.
Jeg har lavet følgende funktion:


function getupdate($ftp_host, $ftp_user, $ftp_pass, $file){
    $conn_id = ftp_connect($ftp_host);
    ftp_set_option($conn_id,FTP_TIMEOUT_SEC,150);
    $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
    if ((!$conn_id) || (!$login_result)){
        // FTP connection has failed
        exit;
    } else
    {
        if (ftp_chdir($conn_id, "html")) {
            $local_file = "update/".$file;
            $server_file = $file;
            $download = ftp_nb_get($conn_id,$local_file,$server_file,FTP_ASCII);
        }           
    }
    // close the FTP stream
    ftp_close($conn_id);
}


//Hent oversigt over filer
getupdate($ftp_host, $ftp_user, $ftp_pass, "files.txt");

//Åbn oversigt
$array = file("update/files.txt");
foreach ($array AS $key => $currentfile) {
    getupdate($ftp_host, $ftp_user, $ftp_pass, $currentfile);
}

Hvis listen udelukkende indeholder 1 filnavn overføres denne som den skal, men ved flere overføres udelukkende den sidste og fejlmeddelelsen:
"Warning: ftp_nb_get() [function.ftp-nb-get]: PORT command successful. Consider using PASV. in /var/www/web11/html/index.php on line 18"

Nogen der kan hjælpe?!?
Avatar billede coderdk Praktikant
27. marts 2008 - 21:02 #1
Du kan prøve efter din ftp_login at sætte ftp_pasv http://dk2.php.net/ftp_pasv
Avatar billede dkfire Nybegynder
27. marts 2008 - 21:31 #2
Det kan skyldes at der er i din $currentfile også optræder et linjeskift til sidst i linjen og den derfor slet ikke henter filen.

Hvordan kan filen files.txt se ud ??

Du kan evt prøve med:
//Åbn oversigt
$array = file("update/files.txt", FILE_IGNORE_NEW_LINES);

således at du ikke for linje ombrydning med, dvs \r, \n eller \r\n.
Ellers kan $currentfile sådan ud:
"etfilnavn.hej\r\n"
Avatar billede dkfire Nybegynder
27. marts 2008 - 21:36 #3
Evt kan du lave en lille debug for lige at tjekke hvad dit script laver:
foreach ($array AS $key => $currentfile) {
    echo "Filen: ".$currentfile." hentes<br />";
    getupdate($ftp_host, $ftp_user, $ftp_pass, $currentfile);
}

Og i din funktion:
if (ftp_chdir($conn_id, "html")) {
    $local_file = "update/".$file;
    $server_file = $file;
    $download = ftp_nb_get($conn_id,$local_file,$server_file,FTP_ASCII);
    if($download == FTP_FAILED)
      echo "Der skete en fejl under henting af filen: ".$file"<br />;
}
Avatar billede dkfire Nybegynder
27. marts 2008 - 21:45 #4
Du bør måske også, når du vælger at bruge ftp_nb_get(), at vente med at overføre den næste fil indtil den først er færdig, ved dog ikke lige om det har nogen betydning.
Avatar billede lubker Nybegynder
27. marts 2008 - 21:52 #5
Jeg har fået dem op at køre.
jeg kalder kun funktionen een gang, og venter inden jeg kalder den næste fil.

Tak for hjælpen.
I kan lægge et svar.
Avatar billede coderdk Praktikant
27. marts 2008 - 21:55 #6
Brug ftp_get i stedet, ellers brug ftp_nb_get ordentligt: http://dk2.php.net/ftp_nb_get (i.e. med ftp_nb_continue og check på FTP_FINISHED)
Avatar billede dkfire Nybegynder
27. marts 2008 - 21:55 #7
Du kan jo vælge at bruge ftp_get(), så behøver du ikke at lave noget kode som venter.
Avatar billede coderdk Praktikant
27. marts 2008 - 21:56 #8
(c:
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester