Skip to content
Advertisement

Api of Multiple file upload in yii2

Hey there I am beginner in yii2 and learning to create a api in yii2 as I stuck when my request has given me only 1 array of file instead of multiple

Below is my model file

<?php

namespace commonmodels;

use Yii;

/**
 * This is the model class for table "question_attachment".
 *
 * @property int $id
 * @property int $question_id
 * @property string $attachment
 */
class QuestionAttachment extends yiidbActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'question_attachment';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['attachment'], 'required'],
            [['question_id'], 'integer'],
            //[['attachment'], 'string', 'max' => 255],
            [['attachment'], 'file', 'maxFiles' => 10,'skipOnEmpty' => true, 'extensions' => 'png, jpge, jpg, pdf, mp4', 'mimeTypes' => 'image/jpeg, image/png, image/jpe'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'question_id' => 'Question ID',
            'attachment' => 'Attachment',
        ];
    }

    public function getQuestions(){
        return $this->hasOne(Question::className(), ['id' => 'id']);
    }
}

And This below code is of action in which I am uploading a multiple images

public function actionMultiple($params=['attributes'=>[
        ['name'=>'QuestionAttachment[attachment]','type'=>'file','description'=>'']],'auth'=>0,'method'=>'POST'])
    {
        $model = new QuestionAttachment();
        $model->question_id = '1';

        if (Yii::$app->request->isPost) {
            $model->attachment = UploadedFile::getInstances($model, 'attachment');
            if(!$model->attachment){
                return array('status'=>false,'message'=>'Please select a photo.');
            }

            if ($model->attachment && $model->validate()) {
                foreach ($model->attachment as $file) {
                    $file->saveAs(Yii::$app->basePath.'/../img_assets/questions/' . $file->baseName . '.' . $file->extension);
                }
            }
        }print_r($model);die();

        return array('status' => true, 'message' => 'Error');
    }

And this is what i got response for this action code

commonmodelsQuestionAttachment Object
(
    [_attributes:yiidbBaseActiveRecord:private] => Array
        (
            [question_id] => 1
            [attachment] => Array
                (
                    [0] => yiiwebUploadedFile Object
                        (
                            [name] => farcry1.jpg
                            [tempName] => /tmp/phpUBNOW2
                            [type] => image/jpeg
                            [size] => 2648781
                            [error] => 0
                            [_tempResource:yiiwebUploadedFile:private] => Array
                                (
                                )

                        )

                )

        )

    [_oldAttributes:yiidbBaseActiveRecord:private] => 
    [_related:yiidbBaseActiveRecord:private] => Array
        (
        )

    [_relationsDependencies:yiidbBaseActiveRecord:private] => Array
        (
        )

    [_errors:yiibaseModel:private] => Array
        (
        )

    [_validators:yiibaseModel:private] => ArrayObject Object
        (
            [storage:ArrayObject:private] => Array
                (
                    [0] => yiivalidatorsRequiredValidator Object
                        (
                            [skipOnEmpty] => 
                            [requiredValue] => 
                            [strict] => 
                            [message] => {attribute} cannot be blank.
                            [attributes] => Array
                                (
                                    [0] => attachment
                                )

                            [on] => Array
                                (
                                )

                            [except] => Array
                                (
                                )

                            [skipOnError] => 1
                            [enableClientValidation] => 1
                            [isEmpty] => 
                            [when] => 
                            [whenClient] => 
                            [_events:yiibaseComponent:private] => Array
                                (
                                )

                            [_eventWildcards:yiibaseComponent:private] => Array
                                (
                                )

                            [_behaviors:yiibaseComponent:private] => 
                        )

                    [1] => yiivalidatorsNumberValidator Object
                        (
                            [integerOnly] => 1
                            [max] => 
                            [min] => 
                            [tooBig] => 
                            [tooSmall] => 
                            [integerPattern] => /^s*[+-]?d+s*$/
                            [numberPattern] => /^s*[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?s*$/
                            [attributes] => Array
                                (
                                    [0] => question_id
                                )

                            [message] => {attribute} must be an integer.
                            [on] => Array
                                (
                                )

                            [except] => Array
                                (
                                )

                            [skipOnError] => 1
                            [skipOnEmpty] => 1
                            [enableClientValidation] => 1
                            [isEmpty] => 
                            [when] => 
                            [whenClient] => 
                            [_events:yiibaseComponent:private] => Array
                                (
                                )

                            [_eventWildcards:yiibaseComponent:private] => Array
                                (
                                )

                            [_behaviors:yiibaseComponent:private] => 
                        )

                    [2] => yiivalidatorsFileValidator Object
                        (
                            [extensions] => Array
                                (
                                    [0] => png
                                    [1] => jpge
                                    [2] => jpg
                                    [3] => pdf
                                    [4] => mp4
                                )

                            [checkExtensionByMimeType] => 1
                            [mimeTypes] => Array
                                (
                                    [0] => image/jpeg
                                    [1] => image/png
                                    [2] => image/jpe
                                )

                            [minSize] => 
                            [maxSize] => 
                            [maxFiles] => 10
                            [minFiles] => 0
                            [message] => File upload failed.
                            [uploadRequired] => Please upload a file.
                            [tooBig] => The file "{file}" is too big. Its size cannot exceed {formattedLimit}.
                            [tooSmall] => The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.
                            [tooMany] => You can upload at most {limit, number} {limit, plural, one{file} other{files}}.
                            [tooFew] => You should upload at least {limit, number} {limit, plural, one{file} other{files}}.
                            [wrongExtension] => Only files with these extensions are allowed: {extensions}.
                            [wrongMimeType] => Only files with these MIME types are allowed: {mimeTypes}.
                            [attributes] => Array
                                (
                                    [0] => attachment
                                )

                            [on] => Array
                                (
                                )

                            [except] => Array
                                (
                                )

                            [skipOnError] => 1
                            [skipOnEmpty] => 1
                            [enableClientValidation] => 1
                            [isEmpty] => 
                            [when] => 
                            [whenClient] => 
                            [_events:yiibaseComponent:private] => Array
                                (
                                )

                            [_eventWildcards:yiibaseComponent:private] => Array
                                (
                                )

                            [_behaviors:yiibaseComponent:private] => 
                        )

                )

        )

    [_scenario:yiibaseModel:private] => default
    [_events:yiibaseComponent:private] => Array
        (
        )

    [_eventWildcards:yiibaseComponent:private] => Array
        (
        )

    [_behaviors:yiibaseComponent:private] => Array
        (
        )

)

As I uploaded two images but array is showing only one what i messed up?

Advertisement

Answer

So finally I got answer my foreach return statement is not saving more than one data so here is final code

public function actionMultiple(){
        $model = new Media;
        $model->post_id = '2';
        if (Yii::$app->request->ispost) {
            $model->media = UploadedFile::getInstances($model, 'media');
            if ($model->media) {
                foreach ($model->media as $value) {
                    $model = new Media;
                    $model->post_id = '2';
                    $BasePath = Yii::$app->basePath.'/../images/post_images';
                    $filename = time().'-'.$value->baseName.'.'.$value->extension;
                    $model->media = $filename;
                    if ($model->save()) {
                        $value->saveAs($BasePath.$filename);
                    }
                }
                return array('status' => true, 'message' => 'Image Saved'); 
            }
        }
        return array('status' => true, 'data' => $model);
    }
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement