Вот фрагмент кода, который будет делать то, что вы хотите ( из этого вопроса ). Решение PHP кажется более элегантным, и оно добавляет более эффективное решение, которое может работать, использующее веб-сервер для обслуживания контента.
<?php
$path = 'file.mp4';
$size=filesize($path);
$fm=@fopen($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("Content-Type: video/mp4");
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))
{ print fread($fm,min(1024*16,$end-$cur));
$cur+=1024*16;
usleep(1000);
}
die();
Больше производительности
Обратите внимание, что это не самый эффективный способ сделать это, потому что весь файл должен проходить через PHP, поэтому вам просто нужно попробовать, как он идет для вас.
Предполагая, что причина, по которой вы хотите это сделать, состоит в том, чтобы ограничить доступ, и вам потребуется более высокая эффективность позже, вы можете использовать флаг для веб-сервера.
Apache с модулем X-Sendfile или lightty ( информация nginx здесь )
$path = 'file.mp4';
header("X-Sendfile: $path");
die();
Это немного сложнее, и вы должны использовать его только тогда, когда вам это нужно, но приятно знать, что у вас есть опция обновления, когда вы начинаете с чего-то, что довольно просто, но имеет посредственную производительность.