2013-06-27 11 views
15

Первые 3 байта FLV-файла являются сигнатурой «FLV». Теперь мой вопрос:Проверить тип файла (FLV) перед загрузкой файла PHP во временную папку, только прочитав только 3 байта файла

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

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

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

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

Также есть несколько аналогичный вопрос здесь: How to upload a file byte by byte in php

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

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

Благодаря

+0

Не могли бы вы использовать: '$ file = fopen (..); if (fgets ($ file, 3) === "FLV") {..} fclose ($ file); '? –

+2

@ DannyBeckett, пожалуйста, прочитайте руководство fopen здесь: [link] (http://php.net/manual/en/function.fopen.php). Он не позволяет подключиться к клиентскому ПК для загрузки файлов. Это позволяет открывать файл на сервере или файлах через поддерживаемый протокол, и ни одно из них не соответствует моим требованиям. –

+0

Вот почему я спросил *, если бы вы могли его использовать ... –

ответ

9

Сначала укажите session.upload_progress.enabled в своем php.ini.

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

Чтобы получить unique_key:

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

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

+0

+1 к вам. это вопрос, который я имел в течение длительного времени. Большое спасибо. – ncm

+0

@Бурхан Халид, спасибо за ваш ответ. Я столкнулся с этим еще до этого, но есть две проблемы: 1: он работает только с php 5.4 или выше, 2nd: для отслеживания прогресса я должен генерировать другой запрос на сервер, возможно, через ajax, т. Е. Использовать технику на стороне клиента, который я упомянул в моем вопросе, не является опцией –

+0

Это не имеет ничего общего с клиентской стороной, и вы не указали каких-либо конкретных требований к версии PHP. 5.4 уже является _old_ stable (стабильный ток равен 5.5). –

3

@ Бурхан-Халид предоставил более современны и правильный ответ выше.

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

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

+1

Это невозможно с помощью родных php-функций, я уже знаю это, но сам PHP обрабатывает загрузку файла во временную папку, поэтому для этого должны быть некоторые обработчики/функции, мне нужно знать о них, и если их можно подключить к ним –

+0

Я знаю, что мой ответ, возможно, вас не устраивал, но правильное ответное решение было не очень приятным. Я сказал вам правильно. Просто нет способа со стандартным HTTP POST и PHP. Если вы хотите создать флеш-клиент, который отправит его байтом по каналу в файл PHP, который вы можете, но это не было разрешено вашими ограничениями. – DigitalFiz

+0

Прежде всего, я не проголосовал так, как будто я должен был бы, в первый же день, когда вы отправили. Во-вторых, ваш ответ НЕ ПРАВИЛЬНО. Существует способ отслеживания выполнения загрузки файлов, как упоминалось в @BurhanKhalid, не совсем как по требованию, но по крайней мере есть soluton с HTTP POST и PHP. –