这是一个简单的文件上传表单 HTML。
<form enctype="multipart/form-data" action="upload.php" method="POST">
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
php 文件也很简单。
<?php
die();
如您所见,PHP 脚本在服务器端什么都不做。但是当我们上传一个大文件时,这个过程仍然需要很长时间。
我知道,我的 PHP 代码将在 POST 过程结束后执行。PHP必须在解析第一行代码之前准备名为 $_POST 和 $_FILES 的数组。
所以我的问题是:PHP(使用 Apache 或 Nginx)可以在 POST 请求完成之前检查 HTTP 标头吗?
例如,一些 PHP 扩展或 Apache 模块。
有人告诉我 Python 或 node.js 可以解决这个问题,只是想知道 PHP 是否可以。
谢谢。
================ 更新1 ================
我的目标是尝试阻止一些意外的文件上传请求。例如,我们生成了一个唯一令牌作为 POST 目标 URL(如http://some.com/upload.php?token=268dfd235ca2d64abd4cee42d61bde48&t=1366552126)。在服务器端,我的代码如下:
<?php
define(MY_SALT, 'mysalt');
if (!isset($_GET['t']) || !isset($_GET['token']) || abs(time()-$_GET['t'])>3600 || md5(MY_SALT.$_GET['t'])!=$_GET['token']) {//token check
die('token incorrect or timeout');
}
//process the file uploaded
/* ... */
代码看起来很有意义:-P 但不能像我预期的那样节省带宽。原因是 PHP 代码运行太晚,我们无法在文件上传完成之前检查令牌。如果有人在 url 中上传没有正确令牌的文件,我的服务器的网络和 CPU 仍然浪费。
欢迎任何建议。非常感谢。