我想读取一个文件,这是一个远程ftp服务器上的变量。我试着读地址
fopen("ftp://user:pass@localhost/filetoread");
和
$contents = file_get_contents('ftp://ftpuser:123456789@localhost/file.conf');
echo $contents;
两者都不起作用。我还尝试直接向URL发送GET
请求,但该请求也不起作用。如何在不下载的情况下读取FTP文件?
我检查了php警告,它说:
PHP警告:文件\u获取\u内容(ftp://...@localhost/file。conf):无法打开流:FTP服务器无法获取文件大小
在/var/www/html/api/listfolder中。php在线2
我确信该文件存在
PHP FTP URL包装器似乎需要FTPSIZE
命令,而您的FTP服务器不支持该命令。
改用ftp\u fget
:
$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);
(添加错误处理)
请参见PHP:如何将. txt文件从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;