我一直在使用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"> </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,最后的文件名是虚拟的)。
我的问题,因此:
[编辑] 在对与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);
?>
内容类型,路径和长度取自该文件的数据库条目。
答案 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会根据扩展名为您自动输出正确的内容类型/长度。