Тонкая загрузка файла фреймворка работает с POST, не с PUT - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь загрузить файл на сервер Slim Framework, используя PUT.Я успешно создал POST-маршрут, где я могу без проблем получить загруженный файл, но если я отправлю тот же запрос на тот же маршрут, с той лишь разницей, что метод, я получу файл из POST, null из 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, [] и null от var_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, и результат был таким же.

...