我一直在为使用cakephp 2.0.3的教师开发一个网站。一个要求是教师能够上传文件(图像,文档,pdfs和视频),这些文件只能由给定班级的学生查看。我一直在使用phpfpass身将二进制数据读取到http输出流。
这在所有文档中都很好,除了视频,它不会被铬内置播放器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>视图文件是空的,因为所有输出都是在控制器中完成的。我已经浏览过这个网站和google,但是找不到问题的原因,也找不到更好的方法来执行这个功能。我已经核实了标题是正确的,并且在前后没有错误的换行符或数据。。我还检查了是否不需要扩展名(在最后的代码块中,'1‘指定了文件ID,最后的文件名是一个虚拟文件)。
我的问题是:
编辑在对与cakephp分离的视频文件进行fpass身测试后,我发现问题是与视频传输有关,而不是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);
?>内容类型、路径和长度取自该文件的数据库条目。
发布于 2013-02-20 21:00:23
蛋糕具有您想要内置的功能,请查看文档中的媒体观点。请注意,它在Cake2.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将根据扩展自动输出正确的内容类型/长度。
https://stackoverflow.com/questions/14798337
复制相似问题