2

Cakephp 2.0.3 を使用して、教師向けの Web サイトを開発しています。1 つの要件は、特定のクラスの生徒だけが閲覧できるファイル (画像、ドキュメント、PDF、およびビデオ) を教師がアップロードできるようにすることです。私はバイナリデータをhttp出力ストリームに読み込むためにphp fpassthroughを使用していました。

これは、実際の Web サイトで使用される chrome 組み込みプレーヤー、vlc firefox プラグイン、または jwplayer によって再生されないビデオを除いて、すべてのドキュメントで正常に機能しました。ただし、ファイルを保存すると、Windows メディア プレーヤーはファイルを正常に再生します。Cakephp の webroot ディレクトリからファイルを再生しても問題なく動作します。ファイル ビューのコードは次のとおりです。

ファイルをロードして出力するコントローラ コード:

//cakephp find used to pull file information from database
$fileName = "/redacted/" . $File['File']['unit_id'] . "/" . $File['File']['id'];
$fp = fopen($fileName, 'rb');

header("Content-Type: " . $File['File']['type']);
header("Content-Length: " . filesize($fileName));

fpassthru($fp);

使用されるレイアウト:

<?php echo $this->fetch('content'); ?>

jwplayer 読み込みコード:

<div style="width: 200px; height: 91px;" id="1">&nbsp;</div>
<script type="text/javascript">
    jwplayer("1").setup({
        file: "/Files/view/1/blah.m4v",
    });
</script>

すべての出力はコントローラで行われるため、ビュー ファイルは空です。私はこのサイトとグーグルを調べましたが、問題の理由やこの機能を実行するためのより良い方法を見つけることができません. ヘッダーが正しいこと、および の前後に誤った改行やデータがないことを確認しました。拡張子が不要であることも確認しました (最後のコード ブロックでは、「1」はファイル ID を指定し、末尾のファイル名はダミーです)。

したがって、私の質問:

  1. fpassthru()、readfile() などは、php ビデオ パススルーの正しい方法ですか?
  2. この問題は私のコードに固有のものですか、それとも Cakephp の MVC の処理に固有のものですか? 誰かがそのようなソリューションをうまく実装しましたか?
  3. よりうまく機能する他の「箱の外で考える」ソリューション(node.jsまたは他の言語、.htaccessトリックを使用)はありますか。
  4. webroot フォルダーで Cakephp 以外のスクリプトを使用することもできますが、ユーザー セッション データを渡すにはどうすればよいでしょうか? これは単なるばかげた考えですか?

[編集] Cakephp とは別のビデオ ファイルで fpassthrough をテストしたところ、問題は Cakephp ではなくビデオ パススルーにあることがわかりました。次のコードは、app/webroot ディレクトリでテストに使用されました。

<?php
    $fileName = "/var/www/redacted/files/2/1";
    $fp = fopen($fileName, 'rb');
    header("Content-Type: video/mp4");
    header("Content-Length: 18485");
    fpassthru($fp);
?>

コンテンツ タイプ、パス、および長さは、そのファイルのデータベース エントリから取得されました。

4

1 に答える 1

1

Cake には必要な機能が組み込まれています。ドキュメントのMedia Viewsを確認してください。Cake 2.3.0 では非推奨ですが、2.0 を使用しているため、問題なく動作するはずです。次のコードをテストしましたが、jwplayer または VLC プラグインでサンプル m4v を再生しても問題はありませんでした。

$this->viewClass = 'Media';

$fileName = WWW_ROOT . DS . 'sample_iPod.m4v';

$parts = pathinfo($fileName);

$params = array(
    'id' => $parts['basename'],
    'name' => $parts['filename'], // requires PHP >= 5.2.0
    'extension' => $parts['extension'],
    'download' => false,
    'path' => $parts['dirname'] . DS
);

$this->set($params);

Cake は、拡張子に基づいて、正しいコンテンツ タイプ/長さを自動的に出力することに注意してください。

于 2013-02-20T21:00:23.360 に答える