Ja, RTFM... Du använder lämpligast de befintliga FTP-funktionerna som står beskrivna i PHP-manualen: http://se2.php.net/manual/en/book.ftp.php
Kolla på exemplet hur du kopplar upp dig, hämta filen och spara den med ftp-fget.
9 svar · 929 visningar · startad av Guldstrand
Går det att på ett relativt enkelt sätt att hämta/ladda ner en fil från en extern FTP-server (öppen), och sedan spara den på min egen server?
Filen är i gz-format.
Tacksam för all hjälp jag kan få.
Ja, RTFM... Du använder lämpligast de befintliga FTP-funktionerna som står beskrivna i PHP-manualen: http://se2.php.net/manual/en/book.ftp.php
Kolla på exemplet hur du kopplar upp dig, hämta filen och spara den med ftp-fget.
Givetvis har jag läst manualen, men jag får ändå in till det riktigt.
Har testat med följande kod:
<?php
// path to remote file
$remote_file = 'ftp://ftp.sunet.se/pub/fil.gz';
$local_file = 'test.txt';
// open some file to write to
$handle = fopen($local_file, 'w');
// set up basic connection
$conn_id = ftp_connect($ftp_server);
$ftp_user_name = "";
$ftp_user_pass = "";
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv($conn_id, true);
// try to download $remote_file and save it to $handle
if (ftp_fget($conn_id, $handle, $remote_file, FTP_ASCII, 0)) {
echo "successfully written to $local_file\n";
} else {
echo "There was a problem while downloading $remote_file to $local_file\n";
}
// close the connection and the file handler
ftp_close($conn_id);
fclose($handle);
?>
Filen "test.txt" skapas, men inget skrivs i den.
Vilken av de två texterna skrivs ut när du kör koden då?
Vilken av de två texterna skrivs ut när du kör koden då?
Denna:
"There was a problem while downloading..."
Felet borde ligga i att du anger en tokig $remote_file,
Du ska ange fil-struktur-sökvägen, inte en fully qualified URL - det är två helt olika saker.
$remote_file borde alltså bli "/pub/fil.tgz"
Du kanske utelämnar kod, meningenstans ser jag definitionen av $ftp_server. På samma sätt ska $remote_file innehålla sökvägen på servern, gissningsvis $remote_file = '/pub/fil.gz'; i ditt fall. Du kan använda ftp_get istället för ftp_fget om du vill slippa skapa en fil manuellt med fopen.
Det är lite oklart om det du vill överföra är en text-fil eller en binärfil. (I din kod hämtas en .gz-fil och skrivs till en .txt-fil) Överför du en binärfil bör du alltså ange FTP_BINARY istället för FTP_ASCII. FTP_BINARY överför din fil precis som den ser ut, bit för bit. FTP_ASCII gör två saker annorlunda. Dels överför den bara 7 bitar av varje byte (Endast ASCII-tecken) dels konverteras radbrytningar från t ex Windows-format till UNIX-format. Att överföra en binärfil (Som t ex en gz-fil) på det viset är att be om problem. I de allra flesta fall går det dock även bra att överföra text-filer som binary. Det enda undantaget till det som är värt att notera är Perl-filer som alltid bör överföras som ASCII. Alltså, om du tvekar, välj binary.
Felet borde ligga i att du anger en tokig $remote_file,
Du ska ange fil-struktur-sökvägen, inte en fully qualified URL - det är två helt olika saker.
$remote_file borde alltså bli "/pub/fil.tgz"
Meningen (syftet) är att hämta filen från just en "fully qualified URL", (en öppen ftp).
Jag vill endast hämta filen, spara den på min egen server, och sedan även extrahera den.
Ja, men hallå, alltså, det förstår ju jag också - du använder ju ftp och det enda man kan göra med ftp är ju att hämta filer från en ftp-server.
Det betyder ändå inte att du i en variabel avsedd för en fil/katalog-sökväg har tillåtelse att ange en URL.
Hur mycket du än vill :)
Du har dessutom glömt att specificera variablen $ftp_server
Du bör alltså ha med detta:
$ftp_server = 'ftp.sunet.se';
$remote_file = '/pub/fil.tgz';
Ojoj: nitro2k01 hade redan klargjort detta för dig, ser jag nu. Refresh är kung :)
Efter vidare efterforskningar... PHP har en hög funktioner för hantering av gzip-komprimerade filer. Och i likhet med fopen kan dessa öppna filer direkt över FTP. Du kan alltså t ex göra så här:
$url='ftp://ftp.sunet.se/pub/www/Netscape/ls-lR.gz';
$fpi = gzopen($url, 'r');
$fpo = fopen('myfile.txt', 'w');
while(!gzeof($fpi)){
$buffer = gzgets($fpi, 4096);
fputs($fpo, $buffer);
}
gzclose($fpi);
gzclose($fpo);
Denna kod läser in filen ifråga i stycken om 4096 bytes, och skriver till utfilen. (Att den läser filen i stycken är bara en teknikalitet, filen packas upp och hamnar i myfile.txt)
Skulle det vara så att du vill läsa in filen som en array, rad för rad, är det ännu enklare:
$array = gzfile($url);
Dock kanske Sunet blir lite sura om du gör så varje gång någon laddar din sida.