webForumDet fria alternativet

Hämta/ladda ner fil från extern FTP till egen server?

PHP

9 svar · 929 visningar · startad av Guldstrand

Medlem sedan juli 20041 271 inlägg
Frågan#1

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å.

Medlem sedan apr. 20007 588 inlägg
#2

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.

Medlem sedan juli 20041 271 inlägg
#3

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.

Medlem sedan jan. 2005953 inlägg
#4

Vilken av de två texterna skrivs ut när du kör koden då?

Medlem sedan juli 20041 271 inlägg
#5

metalboy skrev:

Vilken av de två texterna skrivs ut när du kör koden då?

Denna:
"There was a problem while downloading..."

Medlem sedan sep. 2006867 inlägg
#6

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"

Medlem sedan aug. 20039 340 inlägg
#7

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.

Medlem sedan juli 20041 271 inlägg
#8

headbug skrev:

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.

Medlem sedan sep. 2006867 inlägg
#9

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 :)

Medlem sedan aug. 20039 340 inlägg
#10

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.

258 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)