Проверьте тип файла (FLV) перед загрузкой файла PHP во временную папку, прочитав только начальные 3 байта файла

Первые 3 байта FLV-файла являются подписью "FLV», Теперь мой вопрос:

Есть ли в PHP возможность обрабатывать загрузку файлов, чтобы мы могли подключиться к входному потоку загрузки файла и проверить первые 3 байта?

Сценарий, я неЯ не хочу, чтобы весь файл был загружен (во временную папку), а затем проверьте, является ли файл FLV или нет, я просто хочу прочитать первые несколько байтов потока загрузки, и если это не так "FLV» затем возврат / выход.

Файл должен быть загружен в форме на основе HTML. Можно'не полагайтесь на JavaScript, загрузчик флэш-памяти или любые обходные пути проверки на стороне клиента, т. е. нужно чисто решение на основе PHP.

Я уже знаю, что PHP не передает управление нашему сценарию, пока не завершит загрузку файла во временную папку и заполнение глобальных переменных, т.е.$_POST $_GET $_FILES и т.п.

Также здесь есть несколько похожий вопрос:Как загрузить файл побайтно в php

но ответы не удовлетворяют моему требованию / вопросу.

Любые идеи действительно ценятся!

Спасибо

 Danny Beckett27 июн. 2013 г., 12:35
Не могли бы вы использовать:$file = fopen(..); if(fgets($file, 3) === "FLV"){..} fclose($file);
 Danny Beckett23 июл. 2013 г., 02:01
Тот'почему я спросилесли Вы могли бы использовать это ...
 Umair Khan27 июн. 2013 г., 12:51
@DannyBeckett, пожалуйста, прочитайте руководство по fopen здесь:ссылка на сайт , Он не позволяет подключаться к клиентскому ПК для загрузки файлов. Это позволяет открыть файл на сервере или файлы через поддерживаемый протокол, и ни один из них не отвечает моим требованиям

Ответы на вопрос(2)

Решение Вопроса

session.upload_progress.enabled в вашем .php.ini

Затем используйтеsession.upload_progress отслеживать, сколько байт загружено. Как только вы достигли минимального порога, проверьте загружаемый временный файл, он будет в$_SESSION[unique_key]['files'][0]['tmp_name'], Если файл неt match, set$_SESSION[unique_key]["cancel_upload"] вTRUEи файл будет отклонен.

Получить :unique_key

ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];

Если выше не работает (у меня нетt), тогда единственным выходом для вас будет создание собственного настраиваемого обработчика для PHP либо в виде модуля Apache (или, что лучше, в качестве пользовательского приложения CGI). Там вы можете сделать свою фильтрацию.

 Burhan Khalid14 июл. 2013 г., 08:35
Это не имеет ничего общего с клиентской стороной, а ты нене упоминать какие-либо конкретные требования к версии PHP. 5.4 ужестарый стабильный (текущий стабильный 5,5).
 Umair Khan14 июл. 2013 г., 08:19
@ Бурхан Халид, спасибо за ваш ответ. Я сталкивался с этим и раньше, но есть две проблемы: 1: он работает только с php 5.4 или выше, 2: чтобы отслеживать прогресс, мне нужно сгенерировать еще один запрос к серверу, возможно, через ajax, то есть использовать технику на стороне клиента, который я упомянул в своем вопросе не вариант
 Umair Khan14 июл. 2013 г., 09:24
Я использую php как модуль apache, без APC. Скажи у меня естьupload.php где я загружаю файл (действие формы устанавливается на upload.php). Теперь, чтобы отслеживать прогресс в соответствии с предоставленным вами кодом, я должен создать еще один скрипт, скажемtrack.php и ударил его через равные промежутки времени, скорее всего, через AJAX, чтобы отследить и отменить загрузку при желании? Я прав? Так как я могу исключить AJAX здесь?
 Umair Khan14 июл. 2013 г., 08:40
@BurhanKhalid Хорошо, я, конечно, могу справиться с версией, но как я могу отслеживать прогресс, не генерируя 2-й запрос на сервер, потому что выиграл скрипт, через который я загружаю файл 'быть доступным, если файл полностью не загружен. Мне нужно сгенерировать еще один запрос к серверу для запуска предоставленного вами кода (для отслеживания хода выполнения), и это можно сделать только с помощью некоторого обходного пути на стороне клиента ИЛИ что-нибудь еще, пожалуйста, дайте мне знать
 ncm11 июл. 2013 г., 17:47
+1 тебе. это вопрос, который у меня был долгое время. большое спасибо вам.
 Burhan Khalid14 июл. 2013 г., 08:47
Вам нужно запустить PHP с модулем Apache, а не под FastCGI (в противном случае это будет работать только после полной загрузки файла). Вам также нужно отключить APC и убедиться, что вы непользовательский идентификатор сеанса установлен; если это невозможно, у вас осталось два варианта - использовать клиентское решение для опроса или создать свой собственный обработчик для PHP.

Краткий ответнет с вашими ограничениями.

Вы не можете получить доступ к этому файлу с помощью PHP, пока он не будет загружен на сервер. После загрузки вы можете прочитать его, но не раньше, по крайней мере, без какого-либо программного обеспечения на стороне клиента, которое позволит вам передавать его на PHP вместо обычной отправки формы.

 Umair Khan16 июл. 2013 г., 11:01
Прежде всего, я неза него проголосовали, как если бы я должен был, я бы сделал, в самый первый день, когда вы опубликовали. Во-вторых, ваш ответ НЕ ПРАВИЛЬНЫЙ. Как упоминалось в @BurhanKhalid, есть способ отслеживания хода загрузки файла, не совсем согласно требованию, но, по крайней мере, есть солютон с HTTP POST и PHP.
 DigitalFiz16 июл. 2013 г., 15:38
Извините, я стою исправлено. Я не видел @BurhanKhalid 's ответ, когда я заметил, что мой получил отрицательный голос. Все еще изучаю систему.
 DigitalFiz15 июл. 2013 г., 23:02
Я знаю, что мой ответ, возможно, не удовлетворил вас, но отрицательный правильный ответ не очень приятен. То, что я сказал вам, правильно. Там просто нетпуть со стандартным HTTP POST и PHP. Если вы хотите создать флеш-клиент, который будет посылать его побайтово через канал в файл PHP, вы можете, но это не разрешено вашими ограничениями.
 Umair Khan04 июл. 2013 г., 08:34
Это невозможно с нативными функциями php, я это уже знаю, но сам PHP обрабатывает загрузку файлов во временную папку, поэтому для этого должны быть некоторые обработчики / функции, мне нужно знать о них, и если это так »можно зацепить их

Ваш ответ на вопрос