2014-11-18 1 views
12

После документации Yii Framework 2.0 http://www.yiiframework.com/doc-2.0/guide-input-file-upload.html Я попытался загрузить изображение. Изображение может быть загружено успешно, но после загрузки изображения я попытался вставить модель в базу данных со следующим кодом.Yii Framework 2.0 Загрузка файлов Ошибка finfo_file(): не удалось открыть поток: нет такого файла или каталога

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

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

+0

Пожалуйста, обновите свой вопрос с кодом –

+0

вашей модели есть какое-либо решение, то необходимо обновить. У меня такая же проблема. Спасибо – user1780370

ответ

11

У меня была точно такая же проблема, и я решил ее по телефону

$model->save(); 

перед тем

$model->file->saveAs() 

Я не знаю, как ваша модель выглядит, но если вы просто экономить фактический файл на сервере и только путь к изображению в БД, он должен работать.

Я думаю, что происходит, когда вы вызываете файл-> saveAs() перед model-> save, проверка модели не выполняется, потому что «файл» больше не содержит загруженных данных (он уже сохранен как ...). Надеюсь, это имеет смысл.

+0

У меня нет метода saveas() в контроллере ... только метод save() ... где вы помещаете этот код? – user1780370

+0

Я понял. Это работа для меня. Спасибо – user1780370

+0

его работа для меня тоже. – Bloodhound

5
$model->file->saveAs(); 

//try delete imageFile file variable before save model 

$model->imageFile = null; 

$model->save(); 
+0

Этот ответ должен быть одобрен, а ответ @s_mdq может привести к сохранению некорректной информации в db, если по какой-либо причине загрузка файла завершилась неудачно. – zergussino

0

Do следующего

$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(); 

Надеется, что это помогает!

0

Мое решение выглядит следующим образом:

$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 
    ]); 
+0

Что делать, если файл не загружен успешно (некоторые проблемы с разрешением файла могут быть)? Изменение имени файла файла перед сохранением не рекомендуется. Сначала загрузите файл, а затем измените его имя и путь (если) в базе данных – SohelAhmedM

0

Заменить

$model->save()

по

$model->save(false)

Это происходит потому, что при выполнении $ модели-> Сохранить() без аргументов, по умолчанию будет sider true т. е. вход должен быть подтвержден (reference). И все входы должны быть проверены перед загрузкой или сохранения в базе данных т.е. выше

$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);

линии и

$model->save()

линии

Итак, наконец, мое предложение является

В вашем XyzController.PHP (в "создать" (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']); 
} 
... 
... 
+0

Отказ от проверки модели - это плохо. Лучше решить проблему, чем притвориться, что ее там нет. – Coz

+0

Мы уже выполнили проверку модели с помощью $ model-> validate(), поэтому зачем проверять два раза – SohelAhmedM

+0

Поскольку это плохой код, и вы не исправляете проблему, вы просто игнорируете ее. Задайте объекту file nuill, $ model-> file = null; то вы можете вызвать $ model-> save() без отмены проверки. Вы получаете гораздо лучший код и более чистый поток. – Coz

0

попробовать $model->file->saveAs($filepath, false) вместо $model->file->saveAs($filepath)
или установить $model->file = null перед вызовом $model->file->saveAs() будет решить проблему

0

, когда мы экономим на поле изображения в дБ, просто используйте

$model->file->name;

при попытке напечатать $ модели-> файл, который вы получите массив

print_r($model->file); die();

2

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

  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 
+0

Второй работал для меня. – nicolascolman

2

У меня был такой же та же проблема, я решаю с этим.

$model->file->saveAs($filepath , false)

затем

$model->save(false)

Важно: в saveAs функции пропуска False параметра.

1

Вам нужно позвонить $ модели-> Save() первый затем $ модели-> файл-> 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 
 
}

Смежные вопросы