При загрузке большого файла ( > 100M) на сервер PHP всегда принимает весь POST данных из браузера. Мы не можем вводить в процесс загрузки.
Например, проверьте значение "token
" до того, как вся передача данных на сервер будет IMPOSSIBLE в моем PHP-коде:
<form enctype="multipart/form-data" action="upload.php?token=XXXXXX" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="3000000" />
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
Итак, я пытаюсь использовать mod_rewrite
следующим образом:
RewriteEngine On
RewriteMap mymap prg:/tmp/map.php
RewriteCond %{QUERY_STRING} ^token=(.*)$ [NC]
RewriteRule ^/upload/fake.php$ ${mymap:%1} [L]
map.php
#!/usr/bin/php
<?php
define("REAL_TARGET", "/upload/real.php\n");
define("FORBIDDEN", "/upload/forbidden.html\n");
$handle = fopen ("php://stdin","r");
while($token = trim(fgets($handle))) {
file_put_contents("/tmp/map.log", $token."\n", FILE_APPEND);
if (check_token($token)) {
echo REAL_TARGET;
} else {
echo FORBIDDEN;
}
}
function check_token ($token) {//do your own security check
return substr($token,0,4) === 'alix';
}
Но... Сбой снова. mod_rewrite
выглядит слишком поздно в этой ситуации. Данные все еще полностью переносятся.
Затем я попробовал Node.js
, как это (code snip):
var stream = new multipart.Stream(req);
stream.addListener('part', function(part) {
sys.print(req.uri.params.token+"\n");
if (req.uri.params.token != "xxxx") {//check token
res.sendHeader(200, {'Content-Type': 'text/plain'});
res.sendBody('Incorrect token!');
res.finish();
sys.puts("\n=> Block");
return false;
}
Результат... сбой снова.
Итак, пожалуйста, помогите мне найти правильный путь для решения этой проблемы или сказать мне, что нет способа.
Похожие вопросы:
Может ли PHP (с Apache или Nginx) проверить HTTP-заголовок до завершения запроса POST?