我正在尝试从ftp站点检索文件并将其流式传输到浏览器。
错误是:
警告:ftp_nb_get() 期望参数 2 为字符串,给定资源
我知道它是一种资源,但我该如何解决这个问题?
if(isset($_GET['filename'])){
$requestfilename = $_GET['filename'];
if($sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP)){
stream_set_write_buffer($sockets[0], 0);
stream_set_timeout($sockets[1], 0);
if($ftp_connection = ftp_connect($ftp_server)){
if (@ftp_login($ftp_connection, $ftp_user, $ftp_pass)) {
if(@ftp_chdir($ftp_connection, $ftp_dir_new)){
if($ret = ftp_nb_get($ftp_connection, $sockets[0], $requestfilename, FTP_BINARY)){
while(ftp_nb_continue($ftp_connection)==FTP_MOREDATA){
$contents = stream_get_contents($sockets[1]);
if($contents !== false) {
echo $contents;
flush();
}
}
if ($ret != FTP_FINISHED) $error[] = 'There was an error downloading the file...';
}else{
$error[] = "Could not ftp_nb_get file from $ftp_server";
}
}else{
$error[] = "Couldn't cd to $ftp_dir_new";
}
} else {
$error[] = "Couldn't connect as $ftp_user";
}
}else{
$error[] = "Couldn't connect to $ftp_server";
}
}else{
$error[] = "Unable to create socket pair";
}
if($sockets){
fclose($sockets[0]);
fclose($sockets[1]);
}
if( ! empty($ftp_connection)) ftp_close($ftp_connection);
}
所以你正在寻找一种替代ftp_nb_get()
,允许你写入STDOUT或任意流,而不是本地文件?
我根本没有使用过这个模块,但看起来ftp_nb_fget
可以满足您的需求。
我知道
这是一个古老的话题,但我遇到了这段代码并发现了小错误。也许有人使用它并且在使其工作时遇到问题。
此代码不适用于非常小的文件,因为ftp_nb_continue甚至不会返回一次FTP_MOREDATA。要解决此问题,您需要将 while 循环更改为:
while($ret == FTP_MOREDATA){
$contents = stream_get_contents($sockets[1]);
if($contents !== false) {
echo $contents;
flush();
}
$ret = ftp_nb_continue($ftp_connection);
}