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 :

uploader un fichier avec symfony 3 [3.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    developpeur analyste fonctionnel
    Inscrit en
    Mars 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : developpeur analyste fonctionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 92
    Par défaut uploader un fichier avec symfony 3
    Bonjour,
    Je veux uploader un fichier avec smyfony 3, j'ai suivie la documentation mais il y a impossible de supprimer le fichier dans le répertoire web lalors qu'il est bien supprimé dans doctrine .

    Je décide donc de passer par créer un service et en utilisant un Listener Doctrine. Cependant j'ai une erreur simple à comprendre mais que je n'arrive pas à resoudre :

    ClassNotFoundException in appDevDebugProjectContainer.php line 340:
    Attempted to load class "BrochureUploadListener" from namespace "Oxy\EmploiBundle\EventListener".
    Did you forget a "use" statement for another namespace?

    mon service.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        app.brochure_uploader:
            class: Oxyjob\EmploiBundle\FileUploader
            arguments: ['%brochures_directory%']
     
        app.doctrine_brochure_listener:
            class: Oxyjob\EmploiBundle\EventListener\BrochureUploadListener
            arguments: ['@app.brochure_uploader']
            tags:
                - { name: doctrine.event_listener, event: prePersist }
                - { name: doctrine.event_listener, event: preUpdate }
    config.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    parameters:
        locale: fr
        brochures_directory: '%kernel.root_dir%/../web/uploads/brochures'
    EventListener.php ajouté à la racine de EmploiBundle

    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
     
    <?php
    // src/AppBundle/EventListener/BrochureUploadListener.php
    namespace Oxy\EmploiBundle\EventListener;
     
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    use Doctrine\ORM\Event\LifecycleEventArgs;
    use Doctrine\ORM\Event\PreUpdateEventArgs;
    use Oxy\EmploiBundle\Entity\document;
    use Oxy\EmploiBundle\FileUploader;
    use Symfony\Component\HttpFoundation\File\File;
    class BrochureUploadListener
    {
    private $uploader;
     
    public function __construct(FileUploader $uploader)
    {
    $this->uploader = $uploader;
    }
     
    public function prePersist(LifecycleEventArgs $args)
    {
    $entity = $args->getEntity();
     
    $this->uploadFile($entity);
    }
     
    public function preUpdate(PreUpdateEventArgs $args)
    {
    $entity = $args->getEntity();
     
    $this->uploadFile($entity);
    }
     
    private function uploadFile($entity)
    {
    // upload only works for Product entities
    if (!$entity instanceof document) {
    return;
    }
     
    $file = $entity->getDocument();
     
    // only upload new files
    if (!$file instanceof UploadedFile) {
    return;
    }
     
    $fileName = $this->uploader->upload($file);
    $entity->setDocument($fileName);
    }
     
      public function postLoad(LifecycleEventArgs $args)
      {
        $entity = $args->getEntity();
     
        $fileName = $entity->getBrochure();
     
        $entity->setBrochure(new File($this->targetPath.'/'.$fileName));
      }
    }
    FileUploader.php racine de EmploiBundle
    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
     
     
    <?php
     
    namespace Oxy\EmploiBundle;
     
    use Symfony\Component\HttpFoundation\File\UploadedFile;
     
     
     
    class FileUploader {
      private $targetDir;
     
      public function __construct($targetDir)
      {
        $this->targetDir = $targetDir;
      }
     
      public function upload(UploadedFile $file)
      {
        $fileName = md5(uniqid()).'.'.$file->guessExtension();
     
        $file->move($this->targetDir, $fileName);
     
        return $fileName;
      }
    }
    Entité document
    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
     
    <?php
     
    namespace Oxy\EmploiBundle\Entity;
    use FOS\UserBundle\Model\User as BaseUser;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
    /**
     * document
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Oxy\EmploiBundle\Repository\documentRepository")
     * @ORM\HasLifecycleCallbacks
     */
    class document
    {
        /**
         * @var int
         */
        private $id;
     
      /**
       * @ORM\ManyToOne(targetEntity="Oxyj\UserBundle\Entity\Utilisateurs", cascade={"persist", "remove"})
       * @ORM\JoinColumn(nullable=true)
       */
        private $utilisateur;
     
     
        /**
         * @ORM\Column(type="string")
         *
         * @Assert\NotBlank(message="Please, upload the product brochure as a PDF file.")
         * @Assert\File(mimeTypes={ "application/pdf" })
         */
        public $document;
     
     
     
        public function __toString() {
            return $this->curriculumVitae;
        }
     
        /**
         * @return int
         */
        public function getId() {
            return $this->id;
        }
     
        /**
         * @param int $id
         */
        public function setId($id) {
            $this->id = $id;
        }
     
        /**
         * @return mixed
         */
        public function getUtilisateur() {
            return $this->utilisateur;
        }
     
        /**
         * @param mixed $utilisateur
         */
        public function setUtilisateur($utilisateur) {
            $this->utilisateur = $utilisateur;
        }
     
        /**
         * @return mixed
         */
        public function getDocument() {
            return $this->document;
        }
     
        /**
         * @param mixed $document
         */
        public function setDocument($document) {
            $this->document = $document;
        }
     
    }
    J'ai suivi la doc :
    http://symfony.com/doc/current/contr...load_file.html

    Apparemment il manque un Use mais aucun ne fonctionne ...j'ai du louper quelques choses.
    Impossible du coup de supprimer le cache. En le supprimant manuellement , cela ne resoud pas le problème.
    Merci d'avance
    Laurent

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    Oxy\EmploiBundle\FileUploader

    dans la structure de ton projet, ou est exactement FileUploader.php ?

  3. #3
    Membre confirmé
    Profil pro
    developpeur analyste fonctionnel
    Inscrit en
    Mars 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : developpeur analyste fonctionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 92
    Par défaut
    Bonjour,

    J'ai un Bundle Oxy/EmploiBundle et FileUploader.php et EvenListener.php sont dans Emploi Bundle , à la racine
    Je te donner l'image du projet ...Nom : 2016-10-06_154601.png
Affichages : 2137
Taille : 9,2 Ko

  4. #4
    Membre confirmé
    Profil pro
    developpeur analyste fonctionnel
    Inscrit en
    Mars 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : developpeur analyste fonctionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 92
    Par défaut
    bon je suis pas fiere, quelques minutes hors de mon écran pour voir qu'il fallait mettre un répertoire EventListener et ajouter le fichier BrochureUploaderListener avec sa classe . normal j 'ai fait n'importe quoi ..
    Par contre si je suprrime le fichier dans un crud. dans la base de donnée c'est bien supprimé mais mon fichier reste la dans uploads/brochures.
    ?Nom : 2016-10-06_160137.png
Affichages : 2164
Taille : 4,0 Ko

    Tu as peut être une idée, comment supprimer le fichier dans le répertoire web en même temps que l'insertion dans la base ;-)

  5. #5
    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
    Bonjour,
    pour supprimer ce fichier a partir de son id :
    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
     
        /**
         * @ORM\PreRemove()
         */
        public function removeUpload()
        {
            if ($file = $this->getAbsolutePath()) {
                unlink($file);
            }
        }
     
        public function getAbsolutePath()
        {
            return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->id.'.'.$this->path;
        }

  6. #6
    Membre confirmé
    Profil pro
    developpeur analyste fonctionnel
    Inscrit en
    Mars 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : developpeur analyste fonctionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 92
    Par défaut
    Super !! Apparemment la doc symfony ne fourni pas tout... pour la suppression . Tu l'ajoute dans l'entité , pour mon cas document ? Comme pour symfony 2
    Cela fonctionne pas le fichier ne se supprime pas ... :-)

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

Discussions similaires

  1. [2.x] upload de fichiers avec symfony 2.3.7 et php5
    Par mounia_emsi dans le forum Symfony
    Réponses: 3
    Dernier message: 03/01/2014, 11h37
  2. Upload de fichier avec jsp
    Par fx2024 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/06/2006, 17h02
  3. Réponses: 3
    Dernier message: 08/05/2006, 23h31
  4. [Upload] Upload de fichier avec un script PHP
    Par largolgd dans le forum Langage
    Réponses: 7
    Dernier message: 23/04/2006, 15h21
  5. Upload de fichier avec variable passée en paramètre
    Par reservoirdev dans le forum ASP
    Réponses: 2
    Dernier message: 22/04/2006, 16h06

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