Задать вопрос
paveluho
@paveluho

Удаленное чтение файла — как собрать указатель файла?

Господа, решил написать удаленное чтение файлов (а именно mp4 со своего сервера, для данной задачи только именно это и подходит), на сколько известно всем, fopen открывает файл для чтения с опцией r (b истинно добавляем) с начала, т.е. 0 байт. Далее пишем скрипт, все чудесно отдаем плееру, все показывает, спрашиваем range у загруженного файла, точнее то что загрузилось в буфер - с помощью stream_get_contents - отлично все отдает, указатель помещает правильно, что логично, когда файл уже загружается в буфер мы просто сдвигаем указатель принудительно в область скачанного... а вот проблема, то что не скачано... нимогу догнать что запилить...
Я так полагаю надо опять создавать запрос если существует range, то какая функция умеет читать удаленный файл и сдвигать указатель на количество байт, чтобы начать получать файл с помещенного указателя в файл.

fseek не предлагать, он также читает из буфера уже скачанное.

file_get_contents - не надежен, судя по мане.

UPD: суть заключается в том, чтобы запрашивать у удаленного файла name.mp4 середину файла (указатель ставить например на 50 байт из 100 к примеру) например, тогда, когда еще fopen не загрузил файл. stream_get_contents - читает уже у открытого fopen, а это говорит о том, что пока не загрузится файл в буфер, читать бесполезно 50 байт (например), т.к. еще 50 не загрузился... и перемещение указателя не будет выполнено ))) с локальными файлами - без проблем отрабатывает, т.к. читает весь файл сразу, а вот http - конечно иное дело. И доварить нимогу в голове как выполнить чтение удаленного файла...
  • Вопрос задан
  • 144 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
stream_get_contents()?
Если нет, то уточните, что вы хотите сделать и в чем собственно вопрос.

UPD:
$url = 'https://az792536.vo.msecnd.net/vms/VMBuild_20171019/VirtualBox/MSEdge/MSEdge.Win10.VirtualBox.zip';
$start = floatval(500*1024*1024); // 500 MB
$len = floatval(1024*5); // 5 KB

$opts = array('http'=>array('method'=>'GET','header'=>"Range: bytes=$start-".($start+$len-1)));
$context = stream_context_create($opts);
print_r($opts);
$result = file_get_contents($url, false, $context);
die('<pre>' . $result);
Ответ написан
@BorisKorobkov Куратор тега PHP
Web developer
Для частичного чтения файла вам поможет отправка заголовка Range: bytes=50-, например, через curl. Ну и сервер, очевидно, тоже должен поддерживать его.
https://www.w3.org/Protocols/rfc2616/rfc2616-sec14...

P.S. При чем тут вообще PHP? Если надо скачать файл с одного сервера на другой - wget из консоли. Если на клиента (браузер) - флэш-плеер.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы