取消HTTP POST请求服务器端

时间:2010-12-29 21:35:59

标签: php perl http post

我正在尝试编写用于上传大文件(> 500MB)的脚本。我想在处理上传之前进行一些身份验证,例如:

$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 个答案:

答案 0 :(得分:6)

哇,已经有5个答案告诉我们怎么做不到。 mod_perl to the rescue,您可以在此处上传整个请求正文之前拒绝请求。

答案 1 :(得分:3)

Apache甚至在调用PHP脚本之前负责上传,因此您将无法获得它。

您可以将流程拆分为两个页面(身份验证,文件上载页面),或者,如果您需要在一个页面中完成所有操作,请在检查身份验证参数后使用AJAX-esque解决方案上传文件。 / p>

答案 2 :(得分:0)

据我所知,你不能用PHP做到这一点。 PHP脚本是为响应请求而启动的,但是在上传文件之前不会“发送”请求,因为正在上传的文件是请求的一部分。

答案 3 :(得分:0)

在您上传到的PHP脚本中,这绝对不可能。

最简单的可能性是在上传发生前一步提供身份验证。

如果这不是一个选项,那么可以想到一个稍微有点奇怪的可能性 - 使用RewriteMap并将其映射到外部程序(应该可以使该程序成为PHP脚本)。

使用RewriteMap可以根据命令行程序的输出重写URL。如果您使用此指令调用(单独的)PHP脚本 - 您将无法使用用户的会话! - 在处理请求之前,您可以访问GET参数。

如果处理失败(=凭据无效),您可以将请求重定向到静态资源,这至少会阻止PHP启动。 (我认为上传的内容无论如何都会占用一些资源,但可能会少于重定向到PHP。)

不保证这是否有效!我没有使用RewriteMap的经验。

答案 4 :(得分:0)

这是因为每个HTTP请求都包含全部表单/ POST数据,包括文件上传数据。

因此,我不相信以这种方式处理文件上载请求,无论您使用哪种脚本语言。

答案 5 :(得分:0)

我认为你不能这样做。您可以做的最好的事情是在onSubmit上运行一个AJAX函数来进行验证,然后如果它返回有效,则执行POST以上传文件。如果身份验证有效,您可以在AJAX脚本中设置$_SESSION,然后在上传脚本中检查该会话var以允许上传。