我正在尝试从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);
}
答案 0 :(得分:2)
所以你正在寻找ftp_nb_get()
的替代方法,它允许你写STDOUT或任意流,而不是本地文件?
我根本没有使用过这个模块,但ftp_nb_fget
看起来像你想做的那样。
答案 1 :(得分:0)
我知道这是一个老话题,但我遇到了这个代码并发现了一个小错误。也许有人使用它并且有问题使它有效。
此代码不适用于非常小的文件,因为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);
}