是否可以在上传文件之前对 multipart/form-data 文件上传请求开始执行 PHP 脚本?

Is it possible to start executing PHP script on a multipart/form-data file upload request before file is uploaded?

这应该是一个常见的用例,但我完全找不到它是否可以实现。

我想在服务器端验证 multipart/form-data 上传的文件扩展名 - 我必须等待文件完全上传吗? 我可能遗漏了一些东西,但这没有意义,尤其是在处理大文件时。

我不能在上传 文件之前执行PHP 、获取元数据并可能完全取消请求吗? 我知道我可以分成两个单独的请求,我正在寻找一个单一请求的解决方案,如果适用的话

您应该等到文件完全上传后才能进行验证。没有一个单一的请求解决方案。

如果您使用 Apache/Nginx HTTP 服务器,它仅在完成从客户端加载整个请求后才执行 PHP 脚本 - 这对您的用例来说太晚了,因为 Sergio 在其他答案正确指出。


PHP 中有一个单一请求解决方案,但您需要 控制 PHP 脚本中的 HTTP 请求

您可以选择不使用 Apache,而是从您的 php-cli 启动一个 HTTP 服务器(或者使用本机 socket functions or some HTTP server package such as react/socket在后台使用它们)。

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server('127.0.0.1:8080', $loop);
$socket->on('connection', function (React\Socket\ConnectionInterface $connection) {
    // here you can have $connection->on(...) event handlers
});
$loop->run();

然后你可以让处理程序处理传入请求的每个块(来自 react/socket 包的示例,特别是 ReadableResourceStream):

$connection->on('data', function ($chunk) {
    echo $chunk;
});

您可以验证其内容并在需要时调用 $connection->close(),从而有效地终止未完成的上传,而不是回显该块。

但这整个事情是一个复杂的解决方案,我建议仅将其用于与生成表单页面的应用程序完全分离的上传服务(它仍然可以 运行 在常规 Apache HTTP 服务器下,因为它更容易)。

您可以在前端与服务器交互之前验证它,在 PHP 脚本在请求完成时执行