Yii Framework 2.0 Загрузка файлов Ошибка finfo_file (): не удалось открыть поток: нет такого файла или каталога

После документации 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(); 

Эта проблема может быть вызвана двумя проблемами , а не только тем, что указано в других ответах:

  1. Ограничения на размер файла PHP – вам нужно убедиться, что ваши настройки PHP позволяют загружать файлы, которые достаточно велики. По умолчанию PHP разрешает только файлы размером 2 МБ, поэтому, если вы попытаетесь загрузить больше, вы можете столкнуться с этой ошибкой и не знаете, почему.

Вы можете изменить его, отредактировав параметры файла 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 .

  1. Проверка модели не удалась – модель больше не содержит загруженные данные пост-темпа. Поэтому вам необходимо проверить модель перед ее сохранением (обратите внимание, что это не будет постоянно происходить в средах / настройках сервера, поэтому лучше всего быть в безопасности).

Вот практический и реальный пример того, как вы будете использовать его в своем контроллере:

 $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 }