Удаленное чтение файла — как собрать указатель файла?
Господа, решил написать удаленное чтение файлов (а именно 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 - конечно иное дело. И доварить нимогу в голове как выполнить чтение удаленного файла...
> fseek не предлагать, он также читает из буфера уже скачанное.
В Вашем примере - происходит чтение из буфера, т.е. stream_get_contents помещает указатель уже в СКАЧАННЫЙ файл помещенный в буфер, оттуда локально происходит помещения указателя в любую точку файла.
Вы попробуйте с файлом в 500 мегабайт указатель переместить на НЕ СУЩЕСТВУЮЩУЮ область (т.к. она еще не скачана в буфер) - получиться что Вам сервер вернет ошибку 416.
stream_get_contents - Читает оставшуюся часть потока в строку
а это говорит о том, что остальная часть - это часть, которая уже получена, а т.к. она не получена, читать нечего, и будет ошибка 416. а нужно вычитывать из удаленного сервера именно с того начала, откуда мы запросили указатель байтов из предельного допустимого области видимости байтов из файла.
Павел, добавил еще пример.
И да, по хорошему стоило бы взять curl. С ним будет проще, если в будущем понадобится что-то более сложное делать с заголовками, или сервер отдаст редирект, например.