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); }