1

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);
}
4

2 に答える 2

2

ftp_nb_get()ローカル ファイルの代わりに、STDOUT または任意のストリームに書き込むことができる代替手段を探していますか?

私はこのモジュールをまったく使用していませんが、あなたが望むように見えftp_nb_fgetます。

于 2012-08-07T05:46:44.680 に答える
0

古いトピックであることは知っていますが、このコードに出くわし、小さなバグを見つけました。多分誰かがそれを使用していて、それを機能させるのに問題があります。

ftp_nb_continue は FTP_MOREDATA を 1 回も返さないため、このコードは非常に小さなファイルでは機能しません。これを修正するには、while ループを次のように変更する必要があります。

while($ret == FTP_MOREDATA){
    $contents = stream_get_contents($sockets[1]);
    if($contents !== false) {
        echo $contents;
        flush();
    }
    $ret = ftp_nb_continue($ftp_connection);
}
于 2016-04-08T08:13:50.177 に答える