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