3

Webroot の外部にアップロードするスクリプトがあります。Web サイトを通じて、ユーザーを画像ドキュメントなどにリンクします。

したがって、画像の場合、リンクは次のようになります。

media.php?file=nameoffile.jpg&user=userid&folder=images

次に、これを使用して画像を表示します。

<img src="media.php?file=nameoffile.jpg&user=userid&folder=images" width="100" border="0">

これは、画像に対してはうまく機能し、ドキュメントをダウンロードするためのリンクを提供します。

私が直面している問題は埋め込みです。ffmpeg を使用して、許可されているすべてのビデオ タイプを flv に変換します (これらのビデオはテスト済みで、問題なく動作しています) が、flv ビデオを埋め込もうとすると、動作しません (ファイルの直接リンクで動作します)。 media.php 経由ではありません)。できれば.swfも埋め込みたいです。

jwplayer を使用して埋め込みます (media.php ではなく、ファイルの直接リンクで動作します)。

        <!-- START OF THE PLAYER EMBEDDING TO COPY-PASTE --> 
            <object id="player" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" name="player" width="328" height="200"> 
            <param name="movie" value="player.swf" /> 
            <param name="allowfullscreen" value="true" /> 
            <param name="allowscriptaccess" value="always" /> 
            <param name="flashvars" value="media.php?file=nameoffile.flv&user=userid&folder=videos" /> 
            <embed 
                type="application/x-shockwave-flash"
                id="player2"
                name="player2"
                src="player.swf"
                width="328" 
                height="200"
                allowscriptaccess="always" 
                allowfullscreen="true"
                flashvars="file=media.php?file=nameoffile.flv&user=userid&folder=videos"
            /> 
            </object> 
            <script type="text/javascript" src="jwplayer.js"></script>
            <!-- END OF THE PLAYER EMBEDDING --> 

media.php は次のとおりです。

        $path_parts = pathinfo($_SERVER['REQUEST_URI']);
        $file = basename(urldecode($_GET['file']));
        $user = basename(urldecode($_GET['user']));
        $folder = basename(urldecode($_GET['folder']));
        $ext = pathinfo($file, PATHINFO_EXTENSION);

        $fileDir = 'pathoutsidewebroot';
        $filePath = $fileDir . $file;

        switch(
        $ext) {
            case "flv": $ctype="video/x-flv"; break;
            // adobe
            case "pdf": $ctype="application/pdf"; break;
            // ms office
            case "doc": $ctype="application/msword"; break;
            case "rtf": $ctype="application/rtf"; break;
            case "xls": $ctype="application/vnd.ms-excel"; break;
            case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
            // open office
            case "odt": $ctype="application/vnd.oasis.opendocument.text"; break;
            case "ods": $ctype="application/vnd.oasis.opendocument.spreadsheet"; break;
            default: $ctype = "application/force-download"; break; 
}

        if(in_array($ext, $valid_formats_vid)){
            if (file_exists($filePath)) {
                header('Content-Type: ' . mime_content_type($filePath));
                header('Content-Length: ' . filesize($filePath));
                readfile($filePath);
        }
        }

        else if(in_array($ext, $valid_formats_img)) {
            if (file_exists($filePath)) {
                header('Content-Type: ' . mime_content_type($filePath));
                header('Content-Length: ' . filesize($filePath));
                readfile($filePath);
            }
        }
        else if(in_array($ext, $valid_formats_docs)) {
                    if (file_exists($filePath))
                    {
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private",false);
            header("Content-Type: $ctype");
            header("Content-Disposition: attachment; filename=\"".basename($filePath)."\";");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".@filesize($filePath));
            set_time_limit(0);
            @readfile($filePath) or die("File not found.");                 }
        }

media.php を介した埋め込みからのヘッダー

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Disposition:filename=encoded_2012-10-19_22.37.09_1359032866.flv
Content-Length:0
Content-Type:video/x-flv
Date:Thu, 24 Jan 2013 16:26:32 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=88
Pragma:no-cache
Server:Apache/2.2.20 (Ubuntu)
X-Powered-By:PHP/5.3.6-13ubuntu3.8

ファイルへの直接リンクからのヘッダー (機能するもの)

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:2428614
Content-Type:video/x-flv
Date:Thu, 24 Jan 2013 16:23:54 GMT
ETag:"26ca3d8-250ec6-4d4087c796500"
Keep-Alive:timeout=5, max=100
Last-Modified:Thu, 24 Jan 2013 13:07:00 GMT
Server:Apache/2.2.20 (Ubuntu)

media.php を介してこれに変更することができました (ただし、まだ機能していません)

            header("Content-Type: $ctype");
            header('Content-Length: ' . filesize($filePath));
            header('Accept-Ranges: bytes');
            $now = time( );
            $then = gmstrftime("%a, %d %b %Y %H:%M:%S GMT", $now + 365*86440);
            header("Expires: $then");
            ob_clean();
            flush();
            readfile($filePath);



Accept-Ranges:bytes
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Length:2428614
Content-Type:video/x-flv
Date:Thu, 24 Jan 2013 16:44:18 GMT
Expires:Fri, 24 Jan 2014 20:47:38 GMT
Keep-Alive:timeout=5, max=79
Pragma:no-cache
Server:Apache/2.2.20 (Ubuntu)
X-Powered-By:PHP/5.3.6-13ubuntu3.8
4

3 に答える 3

1

私はそれを次のように動作させることができました。また、プレーヤーの親指の画像も含めました(これはffmpegを介してアップロードされたものです):

header("Content-Type: $ctype");
header('Content-Length: ' . filesize($filePath));
header('Accept-Ranges: bytes');
$now = time( );
$then = gmstrftime("%a, %d %b %Y %H:%M:%S GMT", $now + 365*86440);
header("Expires: $then");
ob_clean();
flush();
readfile($filePath);


$flv_path = 'media.php?file='.$row['cur_image'].'&folder=videos&user='.$row["posted_by"];

$thumb = pathinfo($row['cur_image']);
$thumb_path = 'media.php?file='.$thumb['filename'].'.jpg&folder=videos&user='.$row["posted_by"];
?>           


<!-- START OF THE PLAYER EMBEDDING TO COPY-PASTE -->
<div id="mediaplayer_<?php echo $row['p_id']; ?>">JW Player goes here</div>                           
<script type="text/javascript">
                        jwplayer("mediaplayer_<?php echo $row['p_id']; ?>").setup({
                            flashplayer: "jwplayer/jwplayer.flash.swf",
                            file: "<?php echo $flv_path; ?>",
                            image: "<?php echo $thumb_path; ?>",
                            controlbar: "bottom",
                            width: "380",
                            height: "200",
                            primary: "flash",
                            type: "mp4",
                            controls: true,
                            allowscriptaccess: 'always'
                        });
</script>
<!-- END OF THE PLAYER EMBEDDING -->
于 2013-01-29T09:03:05.883 に答える
1

問題はここにあります:

flashvars="file=media.php?file=nameoffile.flv&user=userid&folder=videos"

flashvarsクエリ文字列を受け取るため、これは次のように解釈されます

file   : media.php?file=nameoffile.flv
user   : userid
folder : videos

file パラメーターを urlencode する必要があります。

flashvars="file=media.php?file=nameoffile.flv&amp;user=userid&amp;folder=videos"
于 2013-01-24T13:17:04.063 に答える
0

ファイル読み取り方法の1つが機能するはずです。次のリンクを確認してください:http ://www.ibm.com/developerworks/library/os-php-readfiles/

コードを変更します。次の行:readfile($ filePath); 他のファイル読み取り機能では、ストリーミングは(PHP fread)でも機能するはずだと思います

PHPマニュアル:fread:有用な情報を提供します。最初のユーザーノートも使用してみてください。 http://php.net/manual/en/function.fread.php

于 2013-01-25T19:54:55.720 に答える