IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Insérer le nom d'un fichier dans la table entité User


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut Insérer le nom d'un fichier dans la table entité User
    Salut a tous,

    Voila, je souhaite insérer en bdd le nom du fichier (image) associé a l'utilisateur connecté, fichier que je stock dans un dossier public/uploads.

    Je ne sais pas comment je dois faire exactement.

    Voici mon controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
        /**
         * @Route("/edit", name="user_edit", methods={"GET","POST"})
         * 
         * @IsGranted("ROLE_USER")
         */
        public function edit(Request $request, FileUploader $fileUploader): Response
        {
            $form = $this->createForm(UserType::class, $this->getUser());
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
     
                /** @var UploadedFile $uploadFile */
                $uploadFile = $form['avatar']->getData();
                if ($uploadFile) {
                    $uploadFileName = $fileUploader->upload($uploadFile);
                    //$user->setAvatar($uploadFileName); // Comment je fais pour insérer le nom du fichier dans ma table ?
                }
     
                $this->getDoctrine()->getManager()->flush();
     
                $this->addFlash(
                    'info',
                    'Votre compte vient d\'être modifié avec succès.'
                );
     
                return $this->redirectToRoute('user_edit');
            }
     
            return $this->render('user/edit.html.twig', [
                'form' => $form->createView(),
            ]);
        }
    J'ai bien essayé de passer User $user dans les paramètres de la méthode mais j'ai une erreur :
    Unable to guess how to get a Doctrine instance from the request information for parameter "user".
    Voici mon formulaire au cas ou...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?php
     
    namespace App\Form;
     
    use App\Entity\User;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Validator\Constraints\File;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\FileType;
     
    class UserType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('firstName')
                ->add('lastName')
                ->add('email')
                ->add('avatar', FileType::class, [
                    'mapped' => false,
                    'constraints' => [
                        new File([
                            'maxSize' => '1024k',
                            'mimeTypes' => [
                                'image/jpeg',
                                'image/png',
                            ],
                            'mimeTypesMessage' => 'Veuillez télécharger une photo au format jpeg ou png',
                        ])
                    ],
                    'attr' => [
                        'onchange' => 'previewFile()'
                    ]
                ])
            ;
        }
     
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => User::class,
            ]);
        }
    }
    Je vous remercie

  2. #2
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    Je n'ai pas bien compris ce qui plantait, désolé.

    Déjà, peux-tu nous dire quel est ce service que tu nommes le FileUploader ?

    Pour User, il semble que c'est une page pour que l'utilisateur change son propre avatar. Dans ce cas, je dirais qu'il suffit de faire cela :
    • Ajouter le service SluggerInterface pour être sûr qu'on te balance pas des caractères à la ... dans ton nom de fichier,
    • Choper l'utilisateur avec $user = $this->getUser();
    • L'entité User doit une propriété $avatar de type string,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
        /**
         * @Route("/edit", name="user_edit", methods={"GET","POST"})
         * 
         * @IsGranted("ROLE_USER")
         */
        public function edit(Request $request, EntityManagerInterface $entityManager, SluggerInterface $slugger): Response
        {
            $user = $this->getUser();
            $form = $this->createForm(UserType::class, $user);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
     
                /** @var UploadedFile $uploadFile */
                $uploadFile = $form['avatar']->getData();
                if ($uploadFile) {
                    $originalFilename = pathinfo($uploadFile->getClientOriginalName(), PATHINFO_FILENAME);
                    //On évite les cochoncetés dans le nom de fichier
                    $safeFilename = $slugger->slug($originalFilename);
                    $newFilename = $safeFilename.'-'.uniqid().'.'.$uploadFile->guessExtension();
     
                    // On déplace le fichier
                    try {
                        $uploadFile->move(
                            $this->getParameter('avatar_directory'),//ça tu le configure
                            $newFilename
                        );
                    } catch (FileException $e) {
                        // ... On n'a pas pu déplacer le fichier 
                    }
     
                    // Mettre à jour l'utilisateur
                    $user->setAvatar($newFilename);
                }
                // Ouh ça marche, mais c'est moche !
                //$this->getDoctrine()->getManager()->flush();
                $entityManager->flush;
                $this->addFlash(
                   'info',
                   'Votre compte vient d\'être modifié avec succès.'
                );
     
                return $this->redirectToRoute('user_edit');
            }
    Symfony a fait une excellente documentation sur ce sujet

    Enfin si tu upload plein d'autres fichiers, tu peux te tourner vers le VichUploaderBundle. Mais pour un vava c'est un peu l'artillerie lourde.
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  3. #3
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    excellent Alex tu as résolu le problème, peut être même sans le savoir

    En résumé, je voulais injecter la valeur du nouveau nom de fichier dans la table user mais je ne savais pas que je pouvais faire un setter avec le "getUser();" comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $user = $this->getUser();
    // ...
    $user->setAvatar($uploadFileName);
    en même temps c'est trompeur car c'est écrit GETuser....... je pensais pouvoir seulement récupérer et non injecter, je ne sais pas si tu vois ou je veux en venir, enfin bref problème résolu !

    pour répondre a ta question concernant mon "FileUploader" c'est un Service que voici (justement sur la base de la doc!) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
     
    namespace App\Service;
     
    use Symfony\Component\HttpFoundation\File\Exception\FileException;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
     
    class FileUploader
    {
        private $targetDirectory;
     
        public function __construct($targetDirectory)
        {
            $this->targetDirectory = $targetDirectory;
        }
     
        public function upload(UploadedFile $file)
        {
            $fileName = uniqid() . '.' . $file->guessExtension();
     
            try {
                $file->move($this->getTargetDirectory(), $fileName);
            } catch (FileException $e) {
                // ... handle exception if something happens during file upload
            }
     
            return $fileName;
        }
     
        public function getTargetDirectory()
        {
            return $this->targetDirectory;
        }
    }
    QUESTION : J'ai bien lu ton commentaire a propos du SluggerInterface : J'ai volontairement supprimé le SluggerInterface car je renomme le fichier de façon aléatoire, est-ce toujours dangereux ?

    Je te remercie pour ton aide précieuse !

  4. #4
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    uniqid te garantit que tu es peinard pour les chaines de caractères. Pour des vavas publics, ça va très bien. Si tu stockais des fichiers importants, je te recommanderais d'utiliser une autre fonction. Un utilisateur reconnaissant la signature de la fonction uniq_id pour ses documents pourrait s'amuser à scanner les fichiers. A parti de symfony 5.1, j'utiliserai cela : https://symfony.com/doc/5.1/components/uid.html
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    ok je ne connaissais pas le UID, c'est intéressant, peut-être la future "norme" a adopter.. pour pour l'info. Je passe le post en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insérer le nom d'un fichier dans une colonne de BDD
    Par andyajram dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/07/2017, 14h52
  2. [CS5.5] extension php upload pour insérer le nom d'une image dans une table
    Par barale61 dans le forum Dreamweaver
    Réponses: 3
    Dernier message: 14/02/2013, 10h48
  3. Commande sh permettant de récupérer le nom d'un fichier dans un repertoire
    Par Actarus78 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/09/2006, 17h18
  4. Récupérer des noms de fichiers dans une table ?
    Par florus dans le forum Access
    Réponses: 5
    Dernier message: 25/03/2006, 17h34
  5. extraire le nom d'un fichier dans une chaine sauf le car -
    Par digger dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 13/12/2005, 00h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo