首页 > 解决方案 > ReactPHP --> 文件上传 --> $request->getUploadedFiles() 返回空数组

问题描述

我正在通过《ReactPHP for Beginners》一书学习 ReactPHP。一切正常,但现在我在文件上传部分。

有一个简单的html表单:

<!DOCTYPE html>
<html lang="de">
    <head>
        <meta charset="UTF-8" />
        <title>ReactPHP App</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" />
    </head>
    <body>
        <div class="container">
            <div class="row">
                <form action="/upload" method="post" enctype="multipart/form-data" class="justify-content-center">
                    <div class="form-group">
                        <label for="file">Submit a file:</label>
                        <input type="file" name="file" id="file" accept="image/x-png,image/jpeg" />
                    </div>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </form>
            </div>
        </div>
    </body>
</html>

而PHP Code女巫接收表单数据也很简单:

<?php
    use Psr\Http\Message\ServerRequestInterface;
    use React\EventLoop\LoopInterface;
    use React\ChildProcess\Process;
    use React\Http\Message\Response;

    return [
        '/' => function(ServerRequestInterface $request, LoopInterface $loop) {
            $childProcess = new Process('cat pages/index.html', __DIR__);
            $childProcess->start($loop);

            return new Response(
                200,
                ['Content-Type' => 'text/html'],
                $childProcess->stdout
            );
        },
        '/upload' => function (ServerRequestInterface $request, LoopInterface $loop) {
            $files = $request->getUploadedFiles();
            $file = $files['file'];
            print_r($file);
          
            return new Response(
              200, ['Content-Type' => 'text/plain'], ''
            );
          }
    ];

如果我选择一个 JPG 文件并单击 «Submit»,$request->getUploadedFiles() 总是返回一个空数组。这里有什么问题?我在 Mac OS X (10.15.7) 上工作,并尝试使用不同的浏览器。

标签: file-uploadreactphp

解决方案


看起来该服务器需要额外的中间件设置才能正确处理文件上传。您必须从React\Http\Middleware\命名空间导入它。

$server = new Server($loop,
    new StreamingRequestMiddleware(),
    new RequestBodyBufferMiddleware(8 * 1024 * 1024), // 8 MiB
    new RequestBodyParserMiddleware(8 * 1024 * 1024, 1), // 8 MiB
    function (ServerRequestInterface $request) use ($router) {
        return $router($request);
});

如果我们使用 curl,只要 ReactPHP 能够处理文件上传,这些额外的中间件是特定于 Web 浏览器的,例如

$ curl --form file=@some_file_that_we_are_going_to_upload http://0.0.0.0:8080/upload

请记住,路径和端口与“ReactPHP for Beginners”一书中的示例相关</p>


推荐阅读