Suivant la documentation de Yii Framework 2.0 http://www.yiiframework.com/doc-2.0/guide-input-file-upload.html J'ai tenté de télécharger une image. L'image pourrait être téléchargée avec succès, mais après l'avoir téléchargée, j'ai essayé d'insérer le modèle dans la base de données avec le code suivant.
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
$model->save();
J'ai eu l'erreur suivante:
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 ....
Le résultat est que l'image a été téléchargée mais que le modèle n'a pas été inséré dans la base de données. Quelqu'un sait-il comment résoudre ceci?
J'avais exactement le même problème et je l'ai résolu en appelant
$model->save();
avant
$model->file->saveAs()
Je ne sais pas à quoi ressemble votre modèle, mais si vous enregistrez simplement le fichier sur le serveur et uniquement le chemin d'accès à l'image dans la base de données, cela devrait fonctionner.
Je pense que ce qui se passe est que lorsque vous appelez fichier-> saveAs () avant modèle-> save, la validation du modèle échoue car 'fichier' ne contient plus les données téléchargées (il est déjà enregistré sous ...). J'espère que cela a du sens.
$model->file->saveAs();
//try delete imageFile file variable before save model
$model->imageFile = null;
$model->save();
J'avais le même problème, je résous avec ça.
$model->file->saveAs($filepath , false)
puis
$model->save(false)
Important: dans la fonction saveAs
, passez le paramètre False
.
Ce problème peut être causé par deux problèmes , pas seulement ce qui est indiqué dans d'autres réponses:
Vous pouvez le changer en modifiant les paramètres de votre fichier php.ini:
memory_limit = 32M
upload_max_filesize = 24M
post_max_size = 32M
Assurez-vous que post_max_size
est supérieur ou égal à upload_max_file_size
et que memory_limit
est supérieur ou égal à post_max_size
.
Voici un exemple concret de la façon dont vous l'utiliseriez dans votre contrôleur:
$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
Vous devez appeler $ model-> save () d'abord puis $ model-> fichier-> saveAs () . Ci-dessous le code de référence.
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
}
Remplacer
$model->save()
par
$model->save(false)
En effet, lorsque vous effectuez $ model-> save () sans argument, il considérera par défaut true
, c’est-à-dire que l’entrée doit être validée ( référence ). Et toutes les entrées. doit être validé avant de télécharger ou de sauvegarder dans la base de données, c'est-à-dire ci-dessus
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
ligne et
$ model-> save ()
ligne
Donc finalement ma suggestion est
Dans votre XyzController.php (dans le scénario "create" (actionCreate éventuellement))
...
...
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]);
}
...
...
Cela fonctionnerait bien dans create scenario, , Mais qu'en est-il de "update" (actionUpdate éventuellement) scenario ? Dans ce cas, j'ai testé la réponse d'Aleksandr Ivin (ci-dessus) et tout fonctionne bien. Voici la description.
Si le téléchargement des images n’est pas obligatoire,
...
...
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']);
}
...
...
quand on enregistre dans le champ image de la base de données, il suffit d’utiliser
$ modèle-> fichier-> nom;
lorsque vous essayez d'imprimer $ model-> file, vous obtenez un tableau
print_r ($ model-> fichier); mourir();
essayez $model->file->saveAs($filepath, false)
au lieu de $model->file->saveAs($filepath)
ou définir $model->file = null
avant d'appeler $model->file->saveAs()
résoudra le problème
Ma solution ressemble à ceci:
$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
]);
Faire comme suit
$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();
J'espère que cela t'aides!