Avatar billede sylvesternielsen Nybegynder
31. oktober 2007 - 14:27 Der er 11 kommentarer og
1 løsning

FTP data connection fejler.

Hej,

Jeg forsøger at forbinde til en FTP server for at overføre en fil.
Jeg får en fejlmeddelelse, og kan ikke se hvad jeg gør forkert.

Filen bliver oprettet på serveren, men der bliver ikke overført noget data.

Jeg får følgende fejl tilbage afhængigt af om de er FTP_ASCII eller FTP_BINARY:
Warning: ftp_put(): Opening ASCII mode data connection for file list. in /opt/debitel/Debitel/Customer/Billing.php
eller
Warning: ftp_put(): Opening BINARY mode data connection for ip-initial-load.txt.
Avatar billede sylvesternielsen Nybegynder
31. oktober 2007 - 14:27 #1
Her er selve funktionen..

    public function ftp($remote_file)
    {
        $this->log->info("Debitel_Customer_Billing - Connecting to FTP server");
        $conn_id = ftp_connect($this->config->ftp->customer->host);
       
        //ftp_pasv($conn_id, true);
        ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 10);
       
        // login with username and password
        $this->log->info("Debitel_Customer_Billing - Logging in to FTP server");
        $login_result = ftp_login($conn_id, $this->config->ftp->customer->user, $this->config->ftp->customer->pass);
       
        // check if connection is ok
        if ((!$conn_id) || (!$login_result)) {
            $this->log->info("Debitel_Customer_Billing - Connecting to FTP server failed!");
            throw new Exception("Could not connect to the FTP server.");
            exit;
        }
       
        // save file to tmp folder
        $filename = "customer.txt";
        $file = $this->config->path->tmp . $filename;
       
        $this->log->info("Debitel_Customer_Billing - Sending file to FTP server.");
        if (!file_put_contents($file, $this->getReport()))
        {
            throw new Exception("Could not save tmp file.");
        }
       
        // transfer file to FTP server
        if (!ftp_put($conn_id, $remote_file, $file, FTP_ASCII))
        {
            $this->log->info("Debitel_Customer_Billing - File transfer failed.");
            throw new Exception("Could not transfer file to FTP server.");
            exit;
        }
        unlink($this->config->path->tmp . $filename);
        return true;
    }
Avatar billede sylvesternielsen Nybegynder
31. oktober 2007 - 14:31 #2
Som en detalje, kan jeg fortælle at jeg kan overføre filer fra maskinen, med en simpel lftp eller ftp kommando. Jeg har forsøgt med både PORT og PASV, så det skulle heller ikke være der problemet ligger.
Avatar billede nielle Nybegynder
31. oktober 2007 - 16:11 #3
Det er ikke umiddelbart fejlbeskeder du får - det er kun warnings.

Det er reelt nok at give en warning, for det er bestemt ikke ligegyldigt om man uploader eller downloader en fil i binær- eller ASCII-mode.

Generelt skal binære filer, som JPG, GIF, WAV osv, uploades som binary, mens at tekstbaserede filer, TXT, PHP-kildekodefiler osv, skal uploades som ascii.

Hvis man ikke følger disse retningslinjer resikere man simplethen at filerne ikke fungere der hvor de er uploadet til.

Forskellen skyldes at binære filer skal uploades "råt som at de ser ud" - ikke en eneste byte må være ændret. Derimod skal tekstbaserede filer ændres mht. den måde linjeskift håndteres på; linjeskift er nemlig noget som variere mellem forskellige operativsystemer, og derfor skal FTP programmet aktivt gå ind og lave en oversættelse samtidigt med at det uploader filen.
Avatar billede nielle Nybegynder
31. oktober 2007 - 17:50 #4
Det skal dertil siges at de fleste FTP programmer har en mulighed for at man kan sætte den til auto-select - altså hvor den selv gætter sig til om en given fil skal uploades som binary eller ascii.
Avatar billede nielle Nybegynder
31. oktober 2007 - 18:34 #5
Ok jeg kan se at du nok har tjek på den del af koden. Har du prøvet at lade være med at slette din temp-fil? Måske er den i virkeligheden tom fra starten af?
Avatar billede sylvesternielsen Nybegynder
01. november 2007 - 08:34 #6
Hej nielle,

Jeg er klar over det med ASCII og BINARY transfer, men ville lige smide begge warnings, da de kunne have betydning.

Jeg har checket at filen indeholder data mm. så det er ikke der problemet ligger.
Det skal siges at min ftp_put fejler, og jeg kan heller ikke benytte en ftp_nlist. Den returnere også bare false.

Som jeg ser det er det i selve data connectionen at det går galt, men det virker trods alt med både ftp og lftp på min linux maskine.
Avatar billede nielle Nybegynder
01. november 2007 - 18:15 #7
Når du skriver "Filen bliver oprettet på serveren, men der bliver ikke overført noget data." er det så i afsender- eller i modtager-enden?

Umiddelbart burde der ikke være noget galt siden at dit tjek på $login_result ikke resultere i at der kastes en exception. Personligt ville jeg dog foretrække koden:

if ($login_result === false) {
    $this->log->info("Debitel_Customer_Billing - Connecting to FTP server failed!");
    throw new Exception("Could not connect to the FTP server.");
    exit;
}
Avatar billede sylvesternielsen Nybegynder
02. november 2007 - 07:13 #8
filen bliver oprettet med data på client siden, og filen bliver oprettet på server siden, men uden data. Altså kan jeg godt kommunikerer med serveren, men jeg kan ikke overfører data til den.

Men jeg kan overføre data til den fra andre ftp programmer fra samme client maskine, så firewallen burde være ok på server siden.
Avatar billede nielle Nybegynder
04. november 2007 - 10:47 #9
Prøv at kalde ftp_close() som en del af dit script.

Det kunne jo tænkes at indholdet ikke bliver flushet til modtagersiden fordi at den ikke er klar over at der ikke kommer mere. Desuden er det pænest at lukke rigtigt.
Avatar billede sylvesternielsen Nybegynder
04. november 2007 - 17:14 #10
Den når at afbryde inden jeg kan lave en ftp_close();

Men ja, naturligvis skal jeg lukke forbindelsen igen.. Koden er kun noget "test" kode, for at se om jeg kan få hul igennem.

Jeg har lavet et script nu som overfører indholdet via lftp. Det fungerer fint. Både i PASV og PORT mode.
Avatar billede nielle Nybegynder
04. november 2007 - 17:21 #11
Ok cool, jamen så husk at få lukket dette spørgsmål. :^)
Avatar billede sylvesternielsen Nybegynder
04. november 2007 - 17:43 #12
Ja, det må jeg hellere.. Selvom jeg ville have ønsket at der var en løsning på PHP delen. :-(
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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation

Skal lukkes AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Teamleder til AL Sydbanks GDPR & Tech Regulation i Aabenraa