Загрузка файла через ActiveController

Всё что касается построения API
Ответить
konstantin22
Сообщения: 10
Зарегистрирован: 2017.07.30, 11:35

Загрузка файла через ActiveController

Сообщение konstantin22 »

Всем привет. Такая ситуация: отправляю форму с файлом на create action. Но он не видит файл/либо не считывает. Причем файл есть, если переопределить метод actionCreate и написать свою обработку по типу
$model = new Media();
$model->load(Yii::$app->request->post());
$upload = UploadedFile::getInstance($model, 'file');

То модель получает файл и можно его сохранить. Почему без костылей по умолчанию ActiveController не сохраняет файл? Можно ли решить вопрос без костылей и доп. метода к примеру actionUpload ?

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

<?php

namespace app\modules\media\models\entity;

use mohorev\file\UploadBehavior;
use yii\behaviors\TimestampBehavior;
use yii\helpers\Json;

/**
 * This is the model class for table "media".
 *
 * @property int $id
 * @property string $name media file name
 * @property string|null $path full path media
 * @property string|null $json_cdn_data full path media
 * @property object $cdnData
 * @property string $location cdn/server
 * @property string $type cdn/server
 * @property int|null $created_at
 * @property int|null $updated_at
 */
class Media extends \yii\db\ActiveRecord
{
    const LOCATION_SERVER = 'server';
    const LOCATION_CDN = 'cdn';
    const POST_KEY_LOCATION = 'locationStore';

    const MEDIA_TYPE_IMAGE = 'image';
    const MEDIA_TYPE_VIDEO = 'video';
    const MEDIA_TYPE_MUSIC = 'music';

    public static function tableName()
    {
        return 'media';
    }

    public function rules()
    {
        return [
            [['name', 'location'], 'required'],

            [['created_at', 'updated_at'], 'integer'],

            [['name', 'path', 'location', 'type'], 'string', 'max' => 255],

            ['path', 'file', 'extensions' => \Yii::$app->params['files']['extensions']]
        ];
    }

    public function behaviors()
    {
        return [
            TimestampBehavior::class,
            [
                'class' => UploadBehavior::class,
                'attribute' => 'path',
//                'scenarios' => ['default'],
                'path' => '@webroot/upload/',
                'url' => '@web/upload/',
            ],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Имя файла',
            'path' => 'Путь то записи',
            'location' => 'Место хранения',
            'created_at' => 'Дата создания',
            'updated_at' => 'Дата обновления',
        ];
    }

    public function getCdnData()
    {
        return Json::decode($this->json_cdn_data);
    }

    public function getLocations()
    {
        return [
            self::LOCATION_CDN => "CDN",
            self::LOCATION_SERVER => 'Локальный сервер'
        ];
    }
}
ActiveController

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

<?php

namespace app\modules\media\controllers;

use yii\rest\ActiveController;

class RestBackendController extends ActiveController
{
    public $modelClass = 'app\modules\media\models\entity\Media';

    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['corsFilter'] = [
            'class' => \yii\filters\Cors::className(),
        ];

        return $behaviors;
    }
}

duda
Сообщения: 28
Зарегистрирован: 2015.07.06, 22:05

Re: Загрузка файла через ActiveController

Сообщение duda »

\yii\web\UploadedFile::getInstanceByName('file');

konstantin22
Сообщения: 10
Зарегистрирован: 2017.07.30, 11:35

Re: Загрузка файла через ActiveController

Сообщение konstantin22 »

duda писал(а):
2021.06.03, 17:41
\yii\web\UploadedFile::getInstanceByName('file');
вопрос в том что без доп. программирования может ли контроллер сохранять файл или только через костыли

duda
Сообщения: 28
Зарегистрирован: 2015.07.06, 22:05

Re: Загрузка файла через ActiveController

Сообщение duda »

99% что нет.
ActiveController ничего не знает о ваших файлах и где их хранить в отличии от моделей ActiveRecord.

Ответить