У меня есть потоковое видео, прекрасно работающее в CakePHP. Поскольку видеоролики являются частными для каждого пользователя, у меня есть контроллер CakePHP, который обслуживает файлы, если пользователи аутентифицированы. Я также замечаю, что все запросы, отправленные на сервер, имеют заголовок Cookie: CAKEPHP=<stuff>
в их запросе.HTML5 видео в CakePHP
Проблема заключается в том, что когда пользователь останавливается, затем воспроизводит видео или когда пользователь ищет видео, Chrome отправляет запрос диапазона с определенным диапазоном байтов для моего сервера. Запрос немедленно отменяется. Следует отметить, что этот запрос не имеет заголовкаCookie: CAKEPHP=<stuff>
.
Я считаю, что запрос отклонен, потому что нет cookie сеанса. Как заставить хром (и, возможно, другие браузеры) отправлять файлы cookie сеанса?
Мои CakePHP версии 2.4.1
EDIT:
view_media.ctp
<?php echo $this->Html->script(array('//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js', 'mediaelement-and-player'), array('inline' => false));
echo $this->Html->css(array('mediaelementplayer.min'), array('inline' => false));
?>
<video width="320" height="240" controls preload="none">
<?php
if(isset($_SERVER['HTTP_USER_AGENT'])){
$agent = $_SERVER['HTTP_USER_AGENT'];
if (strpos($agent,'Chrome') !== false) {
echo '<source src="/pages/get_media/264/webm" type="video/webm">';
}
if (strpos($agent,'Mozilla') !== false) {
echo '<source src="/pages/get_media/264/mp4" type="video/mp4">';
}
}
?>
Your browser does not support HTML5.
</video>
(Функция view_media в контроллере пустым)
Соответствующий раздел PagesController
public function get_media($id, $type){
$dbh = new PDO('mysql:host='.$dbhost;dbname=$dbname, $username, $password);
//get media info
$sth = $dbh->prepare("SELECT `owner`, `type` FROM media WHERE id=:id");
$sth->bindParam(':id', $id);
$sth->execute();
$row = $sth->fetch();
if($row['owner'] == $this->Auth->user('id')){
if($row['type'] == 'png'){
header("Content-type: image/png");
echo file_get_contents("/srv/Ads/Ad_".$id.".png");
}else if($row['type'] == 'mp4'){
if($type == "mp4"){
header("Content-type: video/mp4");
$filename = "/srv/Ads/Ad_".$id.".mp4";
}else if($type == "webm"){
header("Content-type: video/webm");
$filename = "/srv/Ads/Ad_".$id.".webm";
}else{
die;
}
$this->send_video($filename);
}
die;
}
}
//thanks to http://stackoverflow.com/questions/16732419/mp4-from-php-not-playing-in-html5-video-tag
private function send_video($path){
if (file_exists($path)){
$size=filesize($path);
[email protected]($path,'rb');
if(!$fm) {
// You can also redirect here
header ("HTTP/1.0 404 Not Found");
die;
}
$begin=0;
$end=$size;
if(isset($_SERVER['HTTP_RANGE'])) {
if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i',
$_SERVER['HTTP_RANGE'],$matches)){
$begin=intval($matches[0]);
if(!empty($matches[1])) {
$end=intval($matches[1]);
}
}
}
if($begin>0||$end<$size)
header('HTTP/1.0 206 Partial Content');
else
header('HTTP/1.0 200 OK');
header('Accept-Ranges: bytes');
header('Content-Length:'.($end-$begin));
header("Content-Disposition: inline;");
header("Content-Range: bytes $begin-$end/$size");
header("Content-Transfer-Encoding: binary\n");
header('Connection: close');
$cur=$begin;
fseek($fm,$begin,0);
while(!feof($fm)&&$cur<$end&&(connection_status()==0)){
echo fread($fm,min(1024*16,$end-$cur));
$cur+=1024*16;
usleep(1000);
}
die;
}
}
(get_media не имеет вид)
Эти запросы. На данный момент manage_media.js пуст, я буду использовать его для загрузки всех медиафайлов, в которых работает эта видео.
Я был только о том, чтобы предложить некоторые детали для нового вопроса :) Чем будет полезно следующее: OS/Версия браузера, заголовки успешного, а также проблемного запроса, заголовки и содержимое ответов для этих запросов, код PHP, который обрабатывает файлы, и, возможно, также образец HTML. Кстати, я просто попробовал CakePHP 2.4.1 и Chrome 31.0.1650.57 м на Windows 7 x64, и он отлично работает для меня, cookie сеанса отправляется, как ожидалось. Вы пробовали его с чистым профилем и другими браузерами? – ndm
Я добавил информацию. Моя версия Chrome также 31.0.1650.57m на Windows 8 – dudeofea
Пара точек: вам не нужно, чтобы PHP проверял браузер при печати тега '