将 ftp 文件流式传输到浏览器


Stream ftp file to browser

我正在尝试从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);
}