Отмена HTTP-запроса на стороне сервера POST - PullRequest
2 голосов
/ 30 декабря 2010

Я пытаюсь написать скрипт для загрузки больших файлов (> 500 МБ).Я хотел бы выполнить некоторую аутентификацию перед обработкой загрузки, например:

$id = $_GET['key'];
$size = $_GET['size'];
$time = $_GET['time'];
$signature = $_GET['signature'];

$secret = 'asdfgh123456';

if(sha1($id.$size.$time.$secret) != $signature){
echo 'invalid signature';
exit;
}
process upload...

к сожалению, php запускает этот код только после того, как файл загружен во временный каталог, занимая ценные ресурсы сервера.Есть ли способ сделать это до загрузки?Я пробовал похожие вещи с perl / cgi, но происходит то же самое.

Ответы [ 6 ]

6 голосов
/ 30 декабря 2010

Ух ты, уже 5 ответов, рассказывающих, как это невозможно сделать.mod_perl на помощь , здесь вы можете отклонить запрос до загрузки всего тела запроса.

3 голосов
/ 30 декабря 2010

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

Вы можете разделить процесс на две страницы (аутентификация, страница загрузки файла) или, если вам нужно сделать все это на одной странице, использовать решение AJAX-esque для загрузки файла после проверки параметров аутентификации. 1003 *

0 голосов
/ 30 декабря 2010

Я не думаю, что вы можете сделать это. Лучшее, что вы можете сделать, - это, вероятно, запустить функцию AJAX onSubmit, чтобы сначала выполнить проверку, а затем, если она вернет значение valid, выполнить POST для загрузки файла. Вы можете установить $_SESSION в своем скрипте AJAX, если аутентификация действительна, а затем проверить наличие этого сеанса var в скрипте загрузки, чтобы разрешить загрузку.

0 голосов
/ 30 декабря 2010

Это связано с тем, что каждый HTTP-запрос содержит все данных формы / POST, включая данные загрузки файла.

Таким образом, я не верю, что возможно обработать запрос на загрузку файла независимо от того, какой язык сценариев вы используете.

0 голосов
/ 30 декабря 2010

Это определенно невозможно в PHP-скрипте, на который вы загружаете.

Самая простая возможность действительно обеспечить аутентификацию за один шаг до загрузки.

Если это такне вариант, на ум приходит одна странная возможность - использовать RewriteMap и сопоставить его с внешней программой (должна быть возможность сделать эту программу скриптом PHP).

Используя RewriteMap, можно переписать URL-адрес на основе результатов программы командной строки.Если вы используете эту директиву для вызова (отдельного) скрипта PHP - вы не сможете использовать сеанс пользователя!- у вас будет доступ к параметрам GET до обработки запроса.

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

Нет гарантий, сработает ли это!У меня нет собственного опыта работы с RewriteMap.

0 голосов
/ 30 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...