Slim框架文件上传适用于POST,不适用于PUT

时间:2019-02-27 06:29:56

标签: php http file-upload slim

我正在尝试使用PUT将文件上传到我的Slim Framework服务器。我已经成功创建了一个POST路由,可以毫无问题地检索上载的文件,但是如果我将相同的请求发送到相同的路由,唯一的不同是方法,那么我将从POST收到一个文件,而从PUT收到一个空文件。

这是我的路由器:

            $app->put('/users/{id}', 'RideTimeServer\API\Controllers\UserController:update');
            $app->post('/users/{id}', 'RideTimeServer\API\Controllers\UserController:update'); // DEBUG:

然后将请求通过控制器传递给processPicture方法:

    protected function processPicture(Request $request): string
    {
        // First look for an uploaded picture
        if (!empty($request->getUploadedFiles()['picture'])) {
            // http://www.slimframework.com/docs/v3/cookbook/uploading-files.html
            $uploadedFile = $request->getUploadedFiles()['picture'];
            /**
             * { file, name, type }
             */
            var_dump($uploadedFile);
        // Then check URL
        } elseif (!empty($request->getParsedBody()['picture'])) {
            $url = $request->getParsedBody()['picture'];
            if (!filter_var($url, FILTER_VALIDATE_URL)) {
                throw new UserException('Invalid picture URL', 400);
            }
            var_dump($url);
        } else {
            // $this->container['logger']->addInfo('Submitted user with no picture');
            var_dump('Submitted user with no picture');
            var_dump($request->getUploadedFiles());
            var_dump($request->getParsedBody());
        }
        return '';
    }

现在,如果我发送

curl -X PUT \
  http://localhost/ridetime/api/users/1 \
  -H 'Authorization: Bearer t0k3n' \
  -H 'cache-control: no-cache' \
  -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  -F 'picture=@/home/asdf/Tmp/Screenshot_20190125_005049.png'

我从Submitted user with no picture收到[]nullvar_dump,但是如果我将请求更改为POST:

curl -X POST \
  http://localhost/ridetime/api/users/1 \
  -H 'Authorization: Bearer t0k3n' \
  -H 'cache-control: no-cache' \
  -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  -F 'picture=@/home/asdf/Tmp/Screenshot_20190125_005049.png'

我获得了上传文件的详细信息。

我尝试将-F 'picture=@...png替换为--upload-file ./file.png,结果是相同的。

0 个答案:

没有答案