Php 获得;FTP服务器报告550无法获取文件大小。”;在fopen中使用FTP URL时

Php 获得;FTP服务器报告550无法获取文件大小。”;在fopen中使用FTP URL时,php,ftp,Php,Ftp,我想将远程ftp服务器上的文件读取到变量。我试着用地址读 fopen("ftp://user:pass@localhost/filetoread"); 及 两者都不起作用。我还尝试直接向URL发送GET请求,但该请求也不起作用。如何在不下载的情况下读取FTP文件 我检查了php警告,它说: PHP警告:file_get_contents():无法打开流:FTP服务器无法获取文件大小。 在第2行的/var/www/html/api/listfolder.php中 我确信该文件存在似乎需要FTPS

我想将远程ftp服务器上的文件读取到变量。我试着用地址读

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

两者都不起作用。我还尝试直接向URL发送
GET
请求,但该请求也不起作用。如何在不下载的情况下读取FTP文件

我检查了php警告,它说:

PHP警告:file_get_contents():无法打开流:FTP服务器无法获取文件大小。
在第2行的/var/www/html/api/listfolder.php中

我确信该文件存在

似乎需要FTP
SIZE
命令,这是您的FTP服务器不支持的

请使用以下选项:

(添加错误处理)

请参见

似乎需要FTP
SIZE
命令,这是您的FTP服务器不支持的

请使用以下选项:

(添加错误处理)


请参见基于@Martin Prikryl答案的,这里是一个修订版,可用于任何url格式

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;

根据@Martin Prikryl的回答,这里有一个修改版,可用于任何url格式

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;
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;