0
votes

I want to read a file which is on a remote ftp server to a variable. I tried reading with address

fopen("ftp://user:pass@localhost/filetoread");

and

$contents = file_get_contents('ftp://ftpuser:123456789@localhost/file.conf');
echo $contents;

Neither does work. I also tried to send directly GET request to the URL which also doesn't work. How can I read the FTP file without downloading?

I checked the php warning which says:

PHP Warning: file_get_contents(ftp://...@localhost/file.conf): failed to open stream: FTP server reports 550 Could not get file size.
in /var/www/html/api/listfolder.php on line 2

I'm sure that the file exists

2

2 Answers

2
votes

The PHP FTP URL wrapper seems to require FTP SIZE command, what your FTP server does not support.

Use the ftp_fget instead:

$conn_id = ftp_connect('hostname');

ftp_login($conn_id, 'username', 'password');
ftp_pasv($conn_id, true);

$h = fopen('php://temp', 'r+');

ftp_fget($conn_id, $h, '/path/to/file', FTP_BINARY, 0);

$fstats = fstat($h);
fseek($h, 0);
$contents = fread($h, $fstats['size']); 

fclose($h);
ftp_close($conn_id);

(add error handling)

See PHP: How do I read a .txt file from FTP server into a variable?

0
votes

Based on @Martin Prikryl's answer, here a revised one to work with any url format.

function getFtpUrlBinaryContents($url){
    $path_info = parse_url($url);
    $conn_id = ftp_connect($path_info['host'], $path_info['port'] ?? 21);
    if(isset($path_info['user'])){
        ftp_login($conn_id, $path_info['user'], $path_info['pass'] ?? '');
    }
    ftp_pasv($conn_id, true);

    $h = fopen('php://temp', 'r+');

    ftp_fget($conn_id, $h, $path_info['path'], FTP_BINARY, 0);
    $fstats = fstat($h);
    fseek($h, 0);
    $contents = fread($h, $fstats['size']);
    fclose($h);
    ftp_close($conn_id);
    return $contents;
}
$contents = getFtpUrlBinaryContents('ftp://ftpuser:123456789@localhost/file.conf');
echo $contents;