首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cakephp视频传输

Cakephp视频传输
EN

Stack Overflow用户
提问于 2013-02-10 13:40:47
回答 1查看 1.6K关注 0票数 2

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

这在所有文档中都很好,除了视频,它不会被铬内置播放器vlc firefox插件或jwplayer播放,这将在实际的网站上使用。但是,如果我保存该文件,Windows媒体播放器将很好地播放该文件。播放cakephp webroot目录中的文件也很好。以下是文件视图代码:

加载和输出文件的控制器代码:

代码语言:javascript
复制
//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);

所使用的布局:

代码语言:javascript
复制
<?php echo $this->fetch('content'); ?>

jwplayer加载代码:

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

视图文件是空的,因为所有输出都是在控制器中完成的。我已经浏览过这个网站和google,但是找不到问题的原因,也找不到更好的方法来执行这个功能。我已经核实了标题是正确的,并且在前后没有错误的换行符或数据。。我还检查了是否不需要扩展名(在最后的代码块中,'1‘指定了文件ID,最后的文件名是一个虚拟文件)。

我的问题是:

  1. fpassthru()、readfile()或类似的php视频传输方法是正确的吗?
  2. 这个问题是特定于我的代码,还是cakephp处理MVC的固有问题?有人成功地实现了这样的解决方案吗?
  3. 是否还有其他的“开箱思维”解决方案(使用node.js或其他一些语言,.htaccess诡计)会更好地工作。
  4. 我可以在webroot文件夹中使用一个非cakephp脚本,但是如何传递用户会话数据呢?这只是个愚蠢的主意吗?

编辑在对与cakephp分离的视频文件进行fpass身测试后,我发现问题是与视频传输有关,而不是cakephp。此代码用于在app/webroot目录中进行测试:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 21:00:23

蛋糕具有您想要内置的功能,请查看文档中的媒体观点。请注意,它在Cake2.3.0中是不推荐的,但是由于您使用的是2.0,所以它应该工作得很好。我测试了以下代码,并且在jwplayer或VLC插件中播放示例m4v时没有问题:

代码语言:javascript
复制
$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将根据扩展自动输出正确的内容类型/长度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14798337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档