Cakephp视频直通

时间:2013-02-10 13:40:47

标签: php cakephp html5-video mp4 jwplayer

我一直在使用cakephp 2.0.3为教师开发一个网站。一个要求是教师能够上传只能由给定班级的学生查看的文件(图像,文档,PDF和视频)。我一直在使用php fpassthrough将二进制数据读取到http输出流。

除了视频之外的所有文档都可以正常使用,这些文件不会由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>

视图文件为空,因为所有输出都在控制器中完成。我看过这个网站和谷歌,但无法找到问题的原因或更好的方式来执行此功能。我已核实that the headers are correct and that there are no errant line breaks or data before or after。我还检查了扩展名不是必需的(在最后的代码块中,'1'指定文件ID,最后的文件名是虚拟的)。

我的问题,因此:

  1. 是fpassthru(),readfile()还是类似php视频直通的正确方法?
  2. 这个问题是我的代码特有的,还是cakephp处理MVC所固有的?有没有人成功实施过这样的解决方案?
  3. 还有其他“开箱即用”的解决方案(使用node.js或其他语言,.htaccess技巧)可以更好地运作。
  4. 我可以在webroot文件夹中使用非cakephp脚本,但是如何传递用户会话数据呢?这只是一个愚蠢的想法吗?
  5. [编辑] 在对与cakephp分开的视频文件进行测试后,我发现问题在于视频直通而不是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);
    ?>
    

    内容类型,路径和长度取自该文件的数据库条目。

1 个答案:

答案 0 :(得分: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会根据扩展名为您自动输出正确的内容类型/长度。