Загрузка файла методом PUT с помощью UploadedFile

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Haku
Сообщения: 58
Зарегистрирован: 2015.03.11, 07:39

Загрузка файла методом PUT с помощью UploadedFile

Сообщение Haku »

Разрабатываю API и пытаюсь загрузить файл через Postman следующим запросом:

PUT http://project.local/logo
Headers:
· Accept: application/json
· Content-Type: multipart/form-data

Body:
· name: Logo
· logo: C:\Projects\image.png (точнее я меняю тип на "File" и выбираю его в диалоговом окне)

Конфигурация:

Код: Выделить всё

'urlManager' => [
    'rules' => [
        'POST,PUT logo' => 'main/default/index',
    ],
],
Контроллер:

Код: Выделить всё

namespace app\modules\main\controllers;

use yii\rest\Controller;

class DefaultController extends Controller
{
    protected function verbs()
    {
        return [
            'index' => ['post', 'put'],
        ];
    }

    public function actionIndex()
    {
        $model = new Logo();
        $model->image = UploadedFile::getInstanceByName('logo');
        $file = Yii::getAlias('@webroot') . '/logo.' . $model->image->extension;
        $model->image->saveAs($file);
        
        return ['status' => 'success'];
    }
}
В правилах валидации модели указана только проверка на расширение: png.
Проблема заключается в том, что не удаётся загрузить файл HTTP-методом PUT, массив $_FILES просто пустой. Но если только изменить метод на POST — всё отрабатывает отлично. Подскажите, пожалуйста, в чём проблема и можно ли реализовать загрузку файла с помощью PUT и класса UploadedFile?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Загрузка файла методом PUT с помощью UploadedFile

Сообщение rak »

в конфиге

Код: Выделить всё

return [
    'components' => [
        'request' => [
            'parsers' => [
                'multipart/form-data' => 'yii\web\MultipartFormDataParser'
            ],
        ],
    ],
];
в экшен

Код: Выделить всё

$restRequestData = Yii::$app->request->getBodyParams();
$uploadedFile = UploadedFile::getInstancesByName('logo');
Аватара пользователя
Haku
Сообщения: 58
Зарегистрирован: 2015.03.11, 07:39

Re: Загрузка файла методом PUT с помощью UploadedFile

Сообщение Haku »

У меня уже подключён в конфигурации MultipartFormDataParser, но это не решает проблему. Если посмотреть, что находится в переменных из вашего примера, то в "$restRequestData" будет параметр "name", а в "$uploadedFile" будет объект класса UploadedFile. Но если выполнить:

Код: Выделить всё

$uploadedFile->saveAs(Yii::getAlias('@webroot') . '/upload/test.' . $file->extension);
то при POST-запросе изображение сохранится, а при PUT — нет.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Загрузка файла методом PUT с помощью UploadedFile

Сообщение rak »

Haku писал(а): 2019.12.07, 17:22 У меня уже подключён в конфигурации MultipartFormDataParser, но это не решает проблему. Если посмотреть, что находится в переменных из вашего примера, то в "$restRequestData" будет параметр "name", а в "$uploadedFile" будет объект класса UploadedFile. Но если выполнить:

Код: Выделить всё

$uploadedFile->saveAs(Yii::getAlias('@webroot') . '/upload/test.' . $file->extension);
то при POST-запросе изображение сохранится, а при PUT — нет.

Код: Выделить всё

copy($uploadedFile->tempName, Yii::getAlias('@webroot') . '/upload/test.' . $file->extension);
long399
Сообщения: 96
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Загрузка файла методом PUT с помощью UploadedFile

Сообщение long399 »

rak писал(а): 2019.12.03, 12:28 в конфиге

Код: Выделить всё

return [
    'components' => [
        'request' => [
            'parsers' => [
                'multipart/form-data' => 'yii\web\MultipartFormDataParser'
            ],
        ],
    ],
];
Благодарю, это действительно помогло в моем случае! Нашел эту тему при поиске в google. Для метода POST таких проблем нет, а вот при использовании PUT, массив $_FILES оказывался пустым. Добавление парсера решило проблему!
Ответить