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 :

Problème d'upload de fichier


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Student
    Inscrit en
    Octobre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Student
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 5
    Par défaut Problème d'upload de fichier
    Bonjour,
    Je viens de me lancer dans un projet utilisant le framework symfony2, malheureusement je ne le gère encore que trop mal. Ce que j'ai voulu faire dans un premier temps, c'est uploader un fichier image dans le dossier web/img/uploads quand on créé un nouvel article. En suivant la docu officiel et son exemple, ça fonctionne !

    Mais maintenant j'aimerais pouvoir uploader plusieurs images (multiple upload) et j'aimerais enregistrer dans la base de données de nouvelles entrées de la table "Picture" (donc plusieurs pictures pour un seul article). Pour ce faire je voulais m'organiser en 4 étapes. La première qui consistait à tester un simple upload a déjà été effectuée.
    -La deuxième consiste à intégrer un système de multi upload afin de n'être plus limité à une seule et unique image par article.
    -La troisième consiste à pouvoir modifier les images liées à un article directement via l'édition de l'article(editAction du controller ArticleController)
    -La quatrième et dernière étape consiste à rajouter du jquery/javascript afin d'avoir un multi-uploader d'images correctes

    Je suis à la deuxième étape, je n'arrive pas à faire du multi-upload, voici le code que j'ai actuellement :

    Picture.php
    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
     
    ...
     /**
         * Set article
         *
         * @param \EC\ArticlesBundle\Entity\Article $article
         *
         * @return Picture
         */
        public function setArticle(\EC\ArticlesBundle\Entity\Article $article = null)
        {
            $this->article = $article;
            return $this;
        }
     
        /**
         * Get article
         *
         * @return \EC\ArticlesBundle\Entity\Article
         */
        public function getArticle()
        {
            return $this->article;
        }
    Article.php

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
        /**
         * @ORM\Column(type="array")
         */
        private $links;
     
        public function getAbsolutePath()
        {
            return null === $this->link
                ? null
                : $this->getUploadRootDir().'/'.$this->link;
        }
     
        public function getWebPath()
        {
            return null === $this->link
                ? null
                : $this->getUploadDir().'/'.$this->link;
        }
     
        protected function getUploadRootDir()
        {
            // the absolute directory path where uploaded
            // documents should be saved
            return __DIR__.'/../../../../web/'.$this->getUploadDir();
        }
     
        protected function getUploadDir()
        {
            // get rid of the __DIR__ so it doesn't screw up
            // when displaying uploaded doc/image in the view.
            return 'img/uploads';
        }
     
        /**
         * @Assert\File(maxSize="6000000")
         */
        private $file;
     
        /**
         * Sets file.
         *
         * @param UploadedFile $file
         */
        public function setFile(UploadedFile $file = null)
        {
            $this->file = $file;
        }
     
        /**
         * Get file.
         *
         * @return UploadedFile
         */
        public function getFile()
        {
            return $this->file;
        }
     
        public function upload()
        {
              foreach($this->files as $file)
            {
                $link = sha1(uniqid(mt_rand(), true)).'.'.$file->guessExtension();
                array_push ($this->links, $link);
                $file->move($this->getUploadRootDir(), $link);
     
                unset($file);
            }
            // the file property can be empty if the field is not required
            if (null === $this->getFile())
            {
                return;
            }
     
            // use the original file name here but you should
            // sanitize it at least to avoid any security issues
     
            // move takes the target directory and then the
            // target filename to move to
            $this->getFile()->move(
                $this->getUploadRootDir(),
                $this->getFile()->getClientOriginalName()
            );
     
            // set the path property to the filename where you've saved the file
            $this->path = $this->getFile()->getClientOriginalName();
     
            // clean up the file property as you won't need it anymore
            $this->file = null;
        }

    ArticleController.php
    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
    46
    47
    48
    49
     
     public function createAction(Request $request)
        {
            $entity = new Article();
            $form = $this->createCreateForm($entity);
            $form->handleRequest($request);
     
            if ($form->isValid()) {
     
                $em = $this->getDoctrine()->getManager();
                $entity->upload();
                $em->persist($entity);
                $em->flush();
     
                return $this->redirect($this->generateUrl('ec_article_back_home', array('id' => $entity->getId())));
            }
     
            return $this->render('ECArticlesBundle:Article/Admin:index.html.twig', array(
                'entity' => $entity,
                'form'   => $form->createView(),
            ));
        }
     
        /**
         * Creates a form to create a Article entity.
         *
         * @param Article $entity The entity
         *
         * @return \Symfony\Component\Form\Form The form
         */
        private function createCreateForm(Article $entity)
        {
            $form = $this->createFormBuilder($entity)
                ->setAction($this->generateUrl('admin_create'))
                ->setMethod('POST')
                ->add('title', 'text')
                ->add('description', 'text')
                ->add('front', 'text')
                ->add('back', 'text')
                ->add('link', 'text')
                ->add('file', 'file', array(
                    'multiple' => true, 
                    'data_class' => null,
                ))
                ->add('save', 'submit', array('label' => 'Créer'))
                ->getForm();
     
            return $form;
        }
    Comme vous pouvez le voir je suis un peu perdu. J'ai regardé plusieurs topics sur le sujet sans vraiment comprendre comment marchait ce multiupload couplé avec une autre table.
    Pourtant ce cas de figure doit être très courant, dans la plupart des projets nous sommes confrontés à une galerie contenant plusieurs images, donc si vous avez des exemples qui fonctionnent je suis bien entendu preneur.

    Merci de m'avoir lu

  2. #2
    Membre averti
    Femme Profil pro
    web développeur
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : web développeur

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Par défaut
    j'ai été confronté au même problème que toi y a pas si longtemps que ça .. tout dépend de ta version de symfony.. visiblement la mienne ne me permettait pas de faire le multiopload de fichiers .. je me suis donc tournée vers une intégration d'un tynymce dans l'admin. Solution que je trouve bien pratique et facile à mettre en place..
    Je n'ai pas installé de bundle j'ai suivis la doc sur le site officiel.

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Il y a un module d'upload ajax ici avec également si besoin des exemples de crop multiples (sur chaque image avant l'upload multiple).
    Je dis ça au passage car je sais pas si cela pourrait s'intégrer facilement dans symfony...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Student
    Inscrit en
    Octobre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Student
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 5
    Par défaut
    @marween : J'ai effectivement aussi pensé à cette solution mais comme premier projet symfony2, j'aurais bien voulu avoir un truc super propre, donc je vais continuer mes recherches mais merci pour ton conseil.

    @ABCIWEB : N'étant pas un expert dans ce framework, je préférerais d'abord me lancer dans une solution qui a déjà été testée et approuvée avant de faire ma propre cuisine.

    Sinon j'ai découvert le bundle OneupUploader, qui parait-il peut se coupler "facilement avec symfony2". Pour le frontend, on peut utiliser dropzone.js par exemple. Quelqu'un l'a-t-il déjà testé ?

    Voici le lien pour télécharger le bundle :
    https://github.com/1up-lab/OneupUplo...s/doc/index.md


    Je trouve tout de même bizarre qu'il n'y a aucun exemple concret et complet du cas recherché sur internet, car dans la plupart des projets symfony on doit être heurté à ce genre de cas. En tout cas si j'arrive à quelque chose, je n'hésiterai pas à poster ici même ma solution.

    Si quelqu'un a des pistes, des conseils à me donner, un bout de son code etc. je suis toujours preneur !

    Merci à tous pour le temps investi dans la lecture du topic

  5. #5
    Membre averti
    Femme Profil pro
    web développeur
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : web développeur

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Par défaut
    Verifie ta version de Symfony. J'avais pris la version 2.3 car c'était la stable lorsque j'ai commencé mon projet. Je ne sais pas si la suivante l'est ou non mais je sais que celle-là propose pe le multi upload ...

    J'ai parfois pris, installé et mis des bundle pour rien ou pour faire un bête truc. Du coup, au final mon projet est super lourd c'est ce que je reproche à Symfony.
    Du coup, je préfère coder moi même ou prendre des plugins plutôt que de chercher des bundles

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    J'ai rencontré un problème pareil, sauf que moi j'ai trouvé le code php pour faire un upload file et j'ai refais pour 4 fichiers .
    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
     
    $allowed = array('png', 'jpg', 'gif','zip');
     
    if(isset($_FILES['upl']) && $_FILES['upl']['error'] == 0){
     
    	$extension = pathinfo($_FILES['upl']['name'], PATHINFO_EXTENSION);
     
    	if(!in_array(strtolower($extension), $allowed)){
    		echo '{"status":"error"}';
    		exit;
    	}
     
    	if(move_uploaded_file($_FILES['upl']['tmp_name'], 'uploads/'.$_FILES['upl']['name'])){
    		echo '{"status":"success"}';
    		exit;
    	}
    }
     
    echo '{"status":"error"}';
    exit;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type="file" name="upl" multiple />
    Cdt,LM

Discussions similaires

  1. [FTP] Problème pour uploader un fichier
    Par Crazyblinkgirl dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/01/2008, 22h21
  2. [Upload] Problème d'upload de fichier
    Par Halukard dans le forum Langage
    Réponses: 10
    Dernier message: 21/11/2006, 19h36
  3. [Upload] Problème d'upload de fichiers
    Par karo91 dans le forum Langage
    Réponses: 19
    Dernier message: 06/11/2006, 23h24
  4. [Upload] Problème pour uploader un fichier dans mon code
    Par Peuplarchiste dans le forum Langage
    Réponses: 2
    Dernier message: 27/05/2006, 09h48
  5. [Upload] Problème d'upload de fichiers
    Par FredMines dans le forum Langage
    Réponses: 9
    Dernier message: 26/04/2006, 17h13

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