После документации Yii Framework 2.0 http://www.yiiframework.com/doc-2.0/guide-input-file-upload.html Я попытался загрузить изображение. Изображение может быть загружено успешно, но после загрузки изображения я попытался вставить модель в базу данных со следующим кодом.
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); $model->save();
Я получил следующую ошибку:
PHP Warning – yii\base\ErrorException finfo_file(/tmp/phpIGuwiT): failed to open stream: No such file or directory 1. in /var/www/html/website/advanced/vendor/yiisoft/yii2/helpers/BaseFileHelper.php if ($info) { $result = finfo_file($info, $file); finfo_close($info); if ($result !== false) { return $result; } } 2. in /var/www/html/my-project/advanced/vendor/yiisoft/yii2/validators/FileValidator.php – yii\helpers\BaseFileHelper::getMimeType() $mimeType = FileHelper::getMimeType($file->tempName, null, false); 3. 4. and so on ....
В результате изображение загрузилось, но модель не была вставлена в базу данных. Кто-нибудь знает, как это решить?
У меня была такая же проблема, и я решил ее, позвонив
$model->save();
до
$model->file->saveAs()
Я не знаю, как выглядит ваша модель, но если вы просто сохраняете фактический файл на сервере и только путь к изображению в БД, он должен работать.
Я думаю, что происходит, когда вы вызываете file-> saveAs () перед model-> save, проверка модели не выполняется, потому что «файл» больше не содержит загруженных данных (он уже сохранен как …). Надеюсь, это имеет смысл.
$model->file->saveAs(); //try delete imageFile file variable before save model $model->imageFile = null; $model->save();
Эта проблема может быть вызвана двумя проблемами , а не только тем, что указано в других ответах:
Вы можете изменить его, отредактировав параметры файла php.ini:
memory_limit = 32M upload_max_filesize = 24M post_max_size = 32M
Убедитесь, что post_max_size
больше или равно upload_max_file_size
а memory_limit
больше или равно post_max_size
.
Вот практический и реальный пример того, как вы будете использовать его в своем контроллере:
$model->upload_file = UploadedFile::getInstance($model, 'upload_file'); if ($model->validate()) { if ($model->upload_file->saveAs('my/path/filename.txt')) { $model->upload_file = null; $model->save(false); return ['status' => 'success']; // return your custom success } else return ['status'=>'error']; // return your validation errors } } else return ['status'=>'error']; // return your validation errors
У меня была такая же проблема, я решаю с этим.
$model->file->saveAs($filepath , false)
тогда
$model->save(false)
Важно: в функции saveAs
передается параметр False
.
Сделайте следующее
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); // rewrite the file attribute to saved url of the file. $model->file = 'uploads/' . $model->file->baseName . '.' . $model->file->extension; $model->save();
Надеюсь это поможет!
Мое решение выглядит так:
$model = new Film(); $uploads = Yii::getAlias('@uploads'); // Alias root_dir/uploads if ($model->load(Yii::$app->request->post())) { $file = UploadedFile::getInstance($model, 'poster'); $imageName = rand(9999, 999999); $file->name = $imageName . '.' . $file->extension; // override the file name $model->poster = $file; if($model->validate() && $model->save()) { $file->saveAs($uploads . '/posters/' . $model->poster); return $this->redirect(['view', 'id' => $model->film_id]); } } return $this->render('create', [ 'model' => $model ]);
замещать
$model->save()
от
$model->save(false)
Это связано с тем, что когда вы выполняете $ model-> save () без аргумента, по умолчанию будет считаться true
т. Е. Вход должен быть проверен ( ссылка ). И все входные данные должны быть проверены перед загрузкой или сохранением в базе данных, т.е. выше
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
линии и
$ Модели-> Сохранить ()
линия
Поэтому, наконец, мое предложение
В вашем XyzController.php (в сценарии «create» (возможно, ActionCreate))
... ... if($model->validate()) // in "create" (actionCreate possibly) scenario { $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); $model->save(false); } else { $msg = 'Error in saving data! Invalid data'; return $this->render('back', ['err_msg'=>$msg]); } ... ...
Это будет хорошо работать в сценарии создания, но как насчет сценария «обновить» (возможно, ActionUpdate) ? В этом случае я опробовал ответ Александра Ивина (выше), и он работает нормально. Вот описание
Если загрузка изображения не является обязательной,
... ... if($model->image_file = UploadedFile::getInstance($model, 'image_file')) { // do all uploading stuffs here like below line $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); } $model->image_file = null; if($model->save(true)) { $msg = 'Success!'; // set this as flash message if you need return $this->redirect(['index']); } ... ...
попробуйте $model->file->saveAs($filepath, false)
вместо $model->file->saveAs($filepath)
или установите $model->file = null
перед вызовом $model->file->saveAs()
, решит проблему
когда мы сохраняем поле изображения в db, просто используйте
$ Модели-> файл-> имя;
при попытке распечатать файл $ model-> вы получите массив
print_r ($ модели-> файл); умереть();
Вы должны сначала вызвать $ model-> save (), затем $ model-> file-> saveAs () . Ниже приведен код для справки.
if($model->file) { $imagename = 'Profile_'.$model->created_at.rand(100000, 999999); $model->profilepic = $imagename.'.'.$model->file->extension; $path = 'uploads/'; } if($model->save()) { $model->file ? $model->file->saveAs($path.$imagename.'.'.$model->file->extension): null; //the render or redirect code goes here on success } else { //if the validation fails then it will be executed }