31. oktober 2007 - 14:27Der 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.
public function ftp($remote_file) { $this->log->info("Debitel_Customer_Billing - Connecting to FTP server"); $conn_id = ftp_connect($this->config->ftp->customer->host);
// 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; }
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.
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.
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.
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?
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.
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; }
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.
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.
Ja, det må jeg hellere.. Selvom jeg ville have ønsket at der var en løsning på PHP delen. :-(
Synes godt om
Ny brugerNybegynder
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.