Yii2: ввод файла выдает ошибку после отправки формы

Когда я нажимаю кнопку «Зарегистрироваться», я получаю следующую ошибку: Преобразование массива в строку. Я думаю, что ошибка возникает, когда я вызываю метод fileInput(), но я не знаю, как ее решить.
Это частичный код представления.

<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>

<?= $form->field($model, 'password')->passwordInput() ?>

<?= $form->field($model, 'email') ?>


<?= $form->field($modelUpload, 'imageFile')->fileInput() ?>

<div class="form-group">
    <?= Html::submitButton('Signup', ['class' => 'btn', 'name' => 'signup-button']) ?>
</div>
<?php ActiveForm::end(); ?>

Пока это код для контроллера:

    <?php

class SiteController extends Controller {

    /**
     * Signs user up.
     *
     * @return mixed
     */
    public function actionSignup() {
        $model = new SignupForm();
        $modelUpload = new UploadForm();
        if ($model->load(Yii::$app->request->post()) && $modelUpload->load(Yii::$app->request->post())) {
            $modelUpload->imageFile = UploadedFile::getInstances($modelUpload, 'imageFile');

            if ($user = $model->signup()) {

                if (Yii::$app->getUser()->login($user) && $modelUpload->upload()) {

                    return $this->goHome();
                }
            }
        }

        return $this->render('signup', [
                    'model' => $model,
                    'modelUpload' => $modelUpload,
        ]);
    }

}

Это код модели. То же самое и с официальной документацией.

<?php

class UploadForm extends Model {

    /**
     * @var UploadedFile
     */
    public $imageFile;

    public function rules() {
        return [
            [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],
        ];
    }

    public function upload() {
        if ($this->validate()) {
            $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
            return true;
        } else {
            return false;
        }
    }

}
?>

Ошибки:

Первый снимок экрана

Второй снимок экрана

Третий снимок экрана


person Yosirion    schedule 18.03.2018    source источник
comment
Пожалуйста, добавьте конкретную ошибку.   -  person 1stthomas    schedule 18.03.2018
comment
вы должны правильно добавить трассировку стека исходный код, где указана строка, не требуется необходимо добавить полную трассировку стека см. HERE   -  person Muhammad Omer Aslam    schedule 18.03.2018
comment
это странно работает ли это при удалении fileInput из формы, а у вас какая версия Yii2 ?   -  person Muhammad Omer Aslam    schedule 18.03.2018
comment
одна вещь, эта ошибка возникает при отправке формы или загрузке формы в первый раз?   -  person Muhammad Omer Aslam    schedule 18.03.2018
comment
это происходит после отправки   -  person Yosirion    schedule 18.03.2018
comment
он работает без fileInput. @MuhammadOmerAslam   -  person Yosirion    schedule 18.03.2018
comment
добавлен ответ, см. ниже, он будет исправлен, отметьте ответ как правильный, если он работает для вас   -  person Muhammad Omer Aslam    schedule 18.03.2018


Ответы (2)


Instant Solution

Измените свою линию внутри actionSignup() снизу

UploadedFile::getInstances($modelUpload, 'imageFile');

to

UploadedFile::getInstance($modelUpload, 'imageFile');

Reason

Вы загружаете только один файл, а не несколько файлов, поэтому getInstances() должно быть getInstance()

About

getInstance : возвращает загруженный файл для данного атрибута модели. Файл должен быть загружен с помощью [[\yii\widgets\ActiveField::fileInput()]]

getInstances: возвращает все загруженные файлы для данного атрибута модели.

person Muhammad Omer Aslam    schedule 18.03.2018
comment
Я тоже тебя люблю @Yosirion ???? - person Muhammad Omer Aslam; 18.03.2018

если вы хотите загрузить несколько файлов (имея'maxFiles' > 1 в FileValidator правилах вашей модели), измените свое имя атрибута с:

<?= $form->field($modelUpload, 'imageFile')->fileInput() ?>

to

<?= $form->field($modelUpload, 'imageFile[]')->fileInput() ?>

прочитайте это: https://www.yiiframework.com/doc/guide/2.0/en/input-file-upload#uploading-multiple-files

person e-frank    schedule 22.07.2021