Форум программистов, компьютерный форум, киберфорум
long399
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
По возможности буду размещать интересные записи в своем блоге

Разработка API в Yii2. Проблемы с загрузкой файлов методом PUT

Запись от long399 размещена 15.05.2023 в 06:36
Показов 1509 Комментарии 0
Метки api, php, rest api, yii2

Недавно столкнулся с проблемой при разработке API в Yii2, которую удалось решить. Хотелось бы поделиться. Возможно, у кого-то возникнет аналогичная проблема и ему поможет это решение.

В моем API происходит работа с файлами. Клиент отправляет запросы на создание, редактирование и удаление диссертаций. Помимо атрибутов диссертации, которые сохраняются в БД, в запросе еще может быть отправлен pdf-файл диссертации.

При создании записи проблем не возникает. Этот запрос выполняется методом POST.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 * Создание модели.
 * @return \app\models\dissers\DissertationFile
 * @throws \yii\web\ServerErrorHttpException
 * @see \yii\rest\CreateAction
 */
public function actionCreate()
{
    if ($this->checkAccess) {
        call_user_func($this->checkAccess, $this->id);
    }
 
    /* @var $model \app\models\dissers\DissertationFile */
    $model = new $this->modelClass([
        'scenario' => $this->createScenario
    ]);
 
    $params = $this->request->getBodyParams();
    $model->load($params, '');
 
    if ($model->save()) {
        // сохранение файла на сервере (work)
        $model->uploadFile();
 
        $response = Yii::$app->getResponse();
        $response->setStatusCode(201);
        $id = implode(',', $model->getPrimaryKey(true));
        $response->getHeaders()->set('Location', Url::toRoute(['view', 'id' => $id], true));
    } elseif (!$model->hasErrors()) {
        throw new ServerErrorHttpException('Failed to create the object for unknown reason.');
    }
 
    return $model;
}
Мы заносим в БД нужную информацию о диссертации и сохраняем файл на сервере.

Проблема наблюдается при редактировании записи. Например, мы захотели прикрепить к имеющейся диссертации новый pdf-файл. Этот запрос выполняется методом PUT, как и рекомендовано в статьях и доках (вроде этой) по REST API в Yii2. В массиве $_FILES не наблюдается файла, который мы ожидали там увидеть.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * Обновление модели.
 * @param int $id
 * @return \app\models\dissers\Dissertation
 * @throws \yii\web\ServerErrorHttpException
 * @see \yii\rest\UpdateAction
 */
public function actionUpdate($id)
{
    /* @var $model \app\models\dissers\DissertationFile */
    $model = $this->findModel($id);
 
    if ($this->checkAccess) {
        call_user_func($this->checkAccess, $this->id, $model);
    }
 
    $model->scenario = $this->updateScenario;
 
    $params = $this->request->getBodyParams();
    $model->load($params, '');
 
    if ($model->save() === false && !$model->hasErrors()) {
        throw new ServerErrorHttpException('Failed to update the object for unknown reason.');
    }
 
    // сохранение файла на сервере (not work)
    $model->uploadFile();
 
    return $model;
}
В моем случае все разрешилось довольно просто, добавлением нескольких строчек в конфиг приложения:

PHP
1
2
3
4
5
6
7
8
9
10
11
return [
    ...
    'components' => [
        'request' => [
            'parsers' => [
                'multipart/form-data' => 'yii\web\MultipartFormDataParser'
            ]
        ]
    ]
    ...
];
При такой конфигурации, файл успешно попадает в суперглобальный массив $_FILES. И мы уже можем делать с ним, что нам требуется. Например, через класс \yii\web\UploadedFile, как у меня это сделано в методе uploadFile() модели файла диссертации:

PHP
1
2
3
4
5
6
7
8
9
10
11
/**
 * Загрузка файла.
 * @return bool
 */
public function uploadFile(): bool
{
    if (($file = \yii\web\UploadedFile::getInstanceByName('file')) !== null) {
        // сохранение файла
    }
    ...
}
Метки api, php, rest api, yii2
Размещено в PHP, Программирование, Yii2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru