web-dev-qa-db-fra.com

Yii Framework 2.0 Téléchargement de fichiers Erreur finfo_file (): impossible d'ouvrir le flux: aucun fichier ou répertoire de ce type

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?

12
O Connor

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.

11
s_mdq
 $model->file->saveAs();

 //try delete imageFile file variable before save model

 $model->imageFile = null;

 $model->save();
7
Aleksandr Ivin

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.

5
Romesh Gupta

Ce problème peut être causé par deux problèmes , pas seulement ce qui est indiqué dans d'autres réponses:

  1. PHP limites de taille de fichier _ - vous devez vous assurer que les paramètres PHP vous permettent de télécharger des fichiers suffisamment volumineux. Par défaut, PHP n'autorise que les fichiers de 2 Mo. Par conséquent, si vous essayez de télécharger davantage de fichiers, vous risquez de rencontrer cette erreur sans savoir pourquoi.

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.

  1. La validation du modèle échoue - le modèle ne contient plus les données de publication temporaire téléchargées. Par conséquent, vous devez valider le modèle avant de l'enregistrer (notez que cela ne se produira pas de manière uniforme dans tous les environnements/configurations de serveur, il est donc préférable d'être sûr).

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
2
friek108

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
}

1
Ankit Singh

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']);
}
...
...
0
SohelAhmedM

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

0
Albert

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

0
talutocxu

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
    ]);
0
Popov Maxim

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!

0
Muhammad Riyaz