Подтвердить что ты не робот

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 ....

В результате изображение загрузилось, но модель не была вставлена ​​в базу данных. Кто-нибудь знает, как это решить?

4b9b3361

Ответ 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.

  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

Ответ 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 ($ модели- > файл); умереть();