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 ....
В результате изображение загрузилось, но модель не была вставлена в базу данных. Кто-нибудь знает, как это решить?
Ответы
Ответ 1
У меня была такая же проблема, и я решил ее, позвонив
$model->save();
до
$model->file->saveAs()
Я не знаю, как выглядит ваша модель, но если вы просто сохраняете фактический файл на сервере и только путь к изображению в БД, он должен работать.
Я думаю, что происходит, когда вы вызываете file- > saveAs() перед model- > save, проверка модели не выполняется, потому что "файл" больше не содержит загруженных данных (он уже сохранен как...). Надеюсь, что это имеет смысл.
Ответ 2
$model->file->saveAs();
//try delete imageFile file variable before save model
$model->imageFile = null;
$model->save();
Ответ 3
Эта проблема может быть вызвана двумя проблемами, а не только тем, что указано в других ответах:
- Ограничения на размер файла 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
.
- Ошибка проверки модели - модель больше не содержит загруженные данные пост-темпа. Поэтому вам необходимо проверить модель перед ее сохранением (обратите внимание, что это не будет постоянно происходить в средах/настройках сервера, поэтому лучше всего быть в безопасности).
Вот пример практической и реальной жизни того, как вы будете использовать его в своем контроллере:
$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
Ответ 4
У меня была такая же проблема, я решаю с этим.
$model->file->saveAs($filepath , false)
затем
$model->save(false)
Важно: в параметре saveAs
функция pass False
.
Ответ 5
Вам нужно сначала вызвать $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
}
Ответ 6
Сделайте следующее:
$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();
Надеюсь, это поможет!
Ответ 7
Мое решение выглядит так:
$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
]);
Ответ 8
Заменить
$model->save()
$model->save(false)
Это связано с тем, что когда вы выполняете $model- > save() без аргумента, по умолчанию считается true
, то есть вход должен быть проверен
(ссылка).
И все входы должны быть проверены перед загрузкой или сохранением в базе данных, т.е. выше
$model->file->saveAs('uploads/' . $model->file->baseName . '.' .
$model->file->extension);
и
$модели- > Save()
строка
Итак, мое предложение
В вашем 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]);
}
...
...
Это прекрасно работает в сценарии создания,
но как насчет сценария "update" (возможно, 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']);
}
...
...
Ответ 9
попробуйте $model->file->saveAs($filepath, false)
вместо $model->file->saveAs($filepath)
или установите $model->file = null
перед вызовом $model->file->saveAs()
, решит проблему
Ответ 10
когда мы сохраняем поле изображения в db, просто используйте
$модели- > файл- > имя
когда вы пытаетесь распечатать файл $model- > , вы получите массив
print_r ($ модели- > файл); умереть();