simplyAl
Guest
Download cкрипт. Как выплюнуть дробленый файл?
Вопрос не типичный.
Был файл file.rar весом 2.5 метра, его взяли и подробили на файлы на «сегменты»
segment1.sg - 1 метр
segment2.sg - 2й метр
segment3.sg - оставшиеся 0.5метра
Все это сохранили в базе данных. (т.е. мы знаем по какому правилу подробился файл, какие байты (начало, конец) в каком сегменте оказались).
Теперь, юзер запрашивает, например
get.php?file=file.rar
Нам нужно выплюнуть _поочередно_ файлы segment1-3.sg, причем так чтобы у юзера на компе файл сохранился в склеенном виде как file.rar.
Вариант со склеиванием "сегментов" предварительно перед их отдачей не подходит, т.к. file.rar может быть и не 2.5 метра, а гигабайта полтора - ОЗУ не хватит. Вариант забуферить склеенный файл перед отдачей на HDD тоже не подходит. Нужно именно на лету "подсовывать" сегменты юзеру.
Если юзер использует менеджер загрузки и одновременно тянет в несколько потоков – тут ничего страшного нет, просто по заголовку GET смотрим с какого места отдавать и начинаем стримить соответствующий сегмент. Тоже самое с докачкой. Вопрос в том, как отстримив 1 сегмент тут же подсунуть следующий, если никаких доп. запросов GET клиент не посылает?
Если бы можно было отслеживать, например, по какому-то событию, то 1й сегмент «ушел» клиенту, то по этому события можно было бы начинать подсовывать второй… а так – как узнать, что 1й сегмент скачан?
Юзеру через ХТТП заголовки, разумеется, выдается размер полного файла в 2.5 метра и он все время думает что именно такой файл он и качает, никаких сегментов он не видит.
Кто-нибудь может посоветовать как это сделать ПХПшным скриптом?
Вопрос не типичный.
Был файл file.rar весом 2.5 метра, его взяли и подробили на файлы на «сегменты»
segment1.sg - 1 метр
segment2.sg - 2й метр
segment3.sg - оставшиеся 0.5метра
Все это сохранили в базе данных. (т.е. мы знаем по какому правилу подробился файл, какие байты (начало, конец) в каком сегменте оказались).
Теперь, юзер запрашивает, например
get.php?file=file.rar
Нам нужно выплюнуть _поочередно_ файлы segment1-3.sg, причем так чтобы у юзера на компе файл сохранился в склеенном виде как file.rar.
Вариант со склеиванием "сегментов" предварительно перед их отдачей не подходит, т.к. file.rar может быть и не 2.5 метра, а гигабайта полтора - ОЗУ не хватит. Вариант забуферить склеенный файл перед отдачей на HDD тоже не подходит. Нужно именно на лету "подсовывать" сегменты юзеру.
Если юзер использует менеджер загрузки и одновременно тянет в несколько потоков – тут ничего страшного нет, просто по заголовку GET смотрим с какого места отдавать и начинаем стримить соответствующий сегмент. Тоже самое с докачкой. Вопрос в том, как отстримив 1 сегмент тут же подсунуть следующий, если никаких доп. запросов GET клиент не посылает?
Если бы можно было отслеживать, например, по какому-то событию, то 1й сегмент «ушел» клиенту, то по этому события можно было бы начинать подсовывать второй… а так – как узнать, что 1й сегмент скачан?
Юзеру через ХТТП заголовки, разумеется, выдается размер полного файла в 2.5 метра и он все время думает что именно такой файл он и качает, никаких сегментов он не видит.
Кто-нибудь может посоветовать как это сделать ПХПшным скриптом?