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

时间:2012-08-07 05:38:19

标签: php browser ftp stream

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

2 个答案:

答案 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);
}