Jump to content

Symfony2 : Probleme upload + validator


Recommended Posts

Salutations à tous,

 

Encore une fois je fais appelle à vos super pouvoirs d'INpactiens, et encore une fois pour Symfony. :D

 

Bref, voici mon problème :

 

J'ai un formulaire pour upload une vidéo, avec titre etc... Et 2 champs files, l'un pour la vidéo et l'autre pour l'image.

 

Donc histoire qu'on ne puisse pas upload n'importe quoi, j'utilise les validators normal.... Quand j'upload la vidéo et l'image au bon format selon la restriction que j'ai mis aucun soucis ça fonctionne parfaitement.

Par contre dès lors que mon champs est pas valide, par là j'essaye d'upload un pdf pour mon champs vidéo par exemple symfony2 me soulève une belle exception au lieu d'utiliser le message :

 

mini_504116exception.png

 

Et l'autre problème du coup, c'est que je suis obligé de vider le cache de mon navigateur sinon mon appli est plantée. :(

 

Je comprends pas pourquoi, et je bloque sur ça :)

 

Mon entité video : (mon entité videoup et image est lié à celle ci)

<?php// Remettre Assert// @Assert\Regex(pattern="/^([a-zA-Zâàäçéèëêïîôöùüû])+([a-zA-Z0-9.âàäçéèëêïîôöùüû-]||\')*$/")namespace Tim\VideothequeBundle\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\Validator\Constraints as Assert;/** * Video * * @ORM\Table(name="video") * @ORM\Entity(repositoryClass="Tim\VideothequeBundle\Repository\VideoRepository") * @ORM\HasLifecycleCallbacks */class Video{    /**     * @var integer     *     * @ORM\Column(name="id", type="integer")     * @ORM\Id     * @ORM\GeneratedValue(strategy="AUTO")     */    private $id;       /**     * @var string     *     * @ORM\Column(name="description", type="text", nullable=false)     *      */    private $description;    /**     * @var string     *     * @ORM\Column(name="nom_video", type="string", length=255, nullable=false)     *      */    private $nomVideo;        /**     * @var string     *     * @ORM\Column(name="author", type="string", length=255, nullable=true)     *      */    private $author;       /**     * @var string     *     * @ORM\Column(name="description_short", type="text", nullable=false)     *      */    private $descriptionShort;        /**     * @var boolean     *      * @ORM\Column(name="active", type="boolean", nullable=true)     */    private $active;                /**     * @ORM\ManyToMany(targetEntity="Tim\VideothequeBundle\Entity\Categorie", inversedBy="videos", cascade={"persist"})     * @ORM\JoinColumn(nullable=true)     */    private $categories;        /**     * @ORM\ManyToMany(targetEntity="Tim\VideothequeBundle\Entity\Tag", inversedBy="videos", cascade={"persist"})     * @ORM\JoinColumn(nullable=true)     */    private $tags;            /**     * @ORM\OneToOne(targetEntity="Tim\VideothequeBundle\Entity\Image", cascade={"persist", "remove"})     * @ORM\JoinColumn(nullable=true)     * @Assert\Valid()     *      */    protected $image;            /**     * @ORM\OneToOne(targetEntity="Tim\VideothequeBundle\Entity\VideoUp", cascade={"persist", "remove"})     * @ORM\JoinColumn(nullable=false)     * @Assert\Valid()     *      */    private $videoUp;

Mon entité Image :

<?phpnamespace Tim\VideothequeBundle\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\Validator\Constraints as Assert;/** * Image * * @ORM\Table(name="image") * @ORM\Entity(repositoryClass="Tim\VideothequeBundle\Repository\ImageRepository") * @ORM\HasLifecycleCallBacks */class Image{    /**     * @var integer     *     * @ORM\Column(name="id", type="integer")     * @ORM\Id     * @ORM\GeneratedValue(strategy="AUTO")     */    private $id;        /**     * @Assert\Image(     *          mimeTypes = {"image/jpg", "image/jpeg", "image/png"},     *          mimeTypesMessage = "Les images doivent être au format JPG, PNG."     * )     */    protected $file;    private $tempFilename;        /**     * @var string     *     * @ORM\Column(name="url", type="string", length=255, nullable=false)     */    private $url;    /**     * @var string     *     * @ORM\Column(name="alt", type="string", length=255, nullable=true)     */    private $alt;

Mon entité videoup : 

<?phpnamespace Tim\VideothequeBundle\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\Validator\Constraints as Assert;/** * VideoUp * * @ORM\Table(name="videoup") * @ORM\Entity(repositoryClass="Tim\VideothequeBundle\Repository\VideoUpRepository") * @ORM\HasLifecycleCallbacks */class VideoUp{    /**     * @var integer     *     * @ORM\Column(name="id", type="integer")     * @ORM\Id     * @ORM\GeneratedValue(strategy="AUTO")     */    private $id;    /**     * @var string     *     * @ORM\Column(name="extension", type="string", length=255)     */    private $extension;        /**     * @Assert\File(     *      mimeTypes={"video/mp4"},     *      mimeTypesMessage="Veuillez uploader une vidéo au format mp4 !"     * )      */    private $file;                private $tempFilename;

Mon formtype :

<?phpnamespace Tim\VideothequeBundle\Form;use Symfony\Component\Form\AbstractType;use Symfony\Component\Form\FormBuilderInterface;use Symfony\Component\OptionsResolver\OptionsResolverInterface;use Tim\VideothequeBundle\Form\ImageType;use Tim\VideothequeBundle\Form\VideoUpType;class VideoType extends AbstractType{        /**     * @param FormBuilderInterface $builder     * @param array $options     */    public function buildForm(FormBuilderInterface $builder, array $options)    {        $builder                        ->add('nomVideo', 'text', array('required' => true))                ->add('description', 'textarea', array('required' => true))            ->add('descriptionShort', 'textarea', array('required' => true, 'label' => 'Résumé'))            ->add('active', 'checkbox', array('required' => false))            ->add('categories', 'entity', array(                'class' => 'TimVideothequeBundle:Categorie',                'property' => 'libelle',                'multiple' => true,                'expanded' => true,                'required' => false,            ))            ->add('tags', 'entity', array(                'class' => 'TimVideothequeBundle:Tag',                'property' => 'libelle',                'multiple' => true,                'expanded' => true,                'required' => false,            ))            ->add('videoUp', new VideoUpType())            ->add('image', new ImageType())        ;    }        /**     * @param OptionsResolverInterface $resolver     */    public function setDefaultOptions(OptionsResolverInterface $resolver)    {        $resolver->setDefaults(array(            'data_class' => 'Tim\VideothequeBundle\Entity\Video'        ));    }    /**     * @return string     */    public function getName()    {        return 'tim_videothequebundle_video';    }}

Et enfin mon action dans le controller :

public function ajouterAction()    {           $User = $this->container->get('security.context')->getToken()->getUser();         $Video = new Video();                $Video->setAuthor($User->getUsername());                $form = $this->createForm(new VideoType, $Video);                $request = $this->get('request');                if($request->getMethod() == 'POST') {                     $form->handleRequest($request);                                       if($form->isValid()) {                                $em = $this->getDoctrine()->getManager();                                   $em->persist($Video);                $em->flush();                                return $this->redirect($this->generateUrl('tim_videotheque_accueil'));            } else {                $this->get('session')->getFlashBag()->add('notice', $form->getErrors());                            }        }                return $this->render('TimVideothequeBundle:Videotheque:ajoutervideo.html.twig', array(            'form' => $form->createView(),        ));    }   

Merci d'avance :chinois:

 

 

Note : J'ai pas mis le code entier des entités c'est normal, si besoin demandez moi ;)

Link to comment
Share on other sites

Je reprécise, L'upload en lui même fonctionne parfaitement. C'est juste avec le validator que ça fonctionne pas... ;)

<?phpnamespace Tim\VideothequeBundle\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\Validator\Constraints as Assert;/** * Image * * @ORM\Table(name="image") * @ORM\Entity(repositoryClass="Tim\VideothequeBundle\Repository\ImageRepository") * @ORM\HasLifecycleCallBacks */class Image{    /**     * @var integer     *     * @ORM\Column(name="id", type="integer")     * @ORM\Id     * @ORM\GeneratedValue(strategy="AUTO")     */    private $id;        /**     * @Assert\Image(     *          mimeTypes = {"image/jpg", "image/jpeg", "image/png"},     *          mimeTypesMessage = "Les images doivent être au format JPG, PNG."     * )     */    protected $file;    private $tempFilename;        /**     * @var string     *     * @ORM\Column(name="url", type="string", length=255, nullable=false)     */    private $url;    /**     * @var string     *     * @ORM\Column(name="alt", type="string", length=255, nullable=true)     */    private $alt;        public function getFile()    {        return $this->file;    }        public function setFile(UploadedFile $file)    {        $this->file = $file;                if (null !== $this->url) {                        $this->tempFilename = $this->url;                        $this->url = null;            $this->alt = null;                    }    }             /**     * Get id     *     * @return integer      */    public function getId()    {        return $this->id;    }         /**     * @ORM\PrePersist()     * @ORM\PreUpdate()     */    public function preUpload()    {        if (null === $this->file) {            return;        }                $this->url = $this->file->guessExtension();        //var_dump($this->url);        //die;                $this->alt = $this->file->getClientOriginalName();            }        /**     * @ORM\PostPersist()     * @ORM\PostUpdate()     */           public function upload()    {        if (null === $this->file) {            return;        }                if (null !== $this->tempFilename) {            $oldFile = $this->getUploadRootDir().'/'.$this->id.'.'.$this->tempFilename;            if (file_exists($oldFile)) {                unlink($oldFile);            }                    }                $this->file->move(                $this->getUploadRootDir(),                $this->id.'.'.$this->url                );    }        /**     * @ORM\PreRemove()     */    public function preRemoveUpload()    {        $this->tempFilename = $this->getUploadRootDir().'/'.$this->id.'.'.$this->url;    }        /**     * @ORM\PostRemove()     */    public function removeUpload()    {        if (file_exists($this->tempFilename)) {            unlink($this->tempFilename);        }    }        public function getUploadDir()    {        return 'bundles/timvideotheque/images';    }        public function getUploadRootDir()    {        return __DIR__.'/../../../../web/'.$this->getUploadDir();    }               public function getWebPath()    {        return $this->getuploadDir().'/'.$this->getId().'.'.$this->getUrl();    }            /**     * Set url     *     * @param string $url     * @return Image     */    public function setUrl($url)    {        $this->url = $url;        return $this;    }    /**     * Get url     *     * @return string      */    public function getUrl()    {        return $this->url;    }    /**     * Set alt     *     * @param string $alt     * @return Image     */    public function setAlt($alt)    {        $this->alt = $alt;        return $this;    }    /**     * Get alt     *     * @return string      */    public function getAlt()    {        return $this->alt;    }     /*    public function __sleep(){	$ref   = new \ReflectionClass(__CLASS__);	$props = $ref->getProperties(\ReflectionProperty::IS_PROTECTED);	 	$serialize_fields = array();	 	foreach ($props as $prop) {		$serialize_fields[] = $prop->name;	}		return $serialize_fields;}        }*/

Voici l'exemple de mon entité Image avec les fonctions upload etc... 

 

Le var_dump dégueulasse de "$this" dans mon action d'ajout vidéo :

 

mini_273498dump.png

 

sachant qu'apparemment au niveau de l'action dans mon controller l'exception est soulevée à partir de "$form->handleRequest($request)", il rentre même pas dans ma condition pour valider le formulaire. 

Link to comment
Share on other sites

  • 2 weeks later...

Salut tu as trouvé une solution ??

 

Le soucie est que ton $file est n'est pas protected il me semble.

Je n'ai pas eu ce problème la mais peux etre que tu doit ajouter a ton entity ceci : 

 

class Image implements \Serializable

 

et

public function serialize(){    return serialize(array(        //tes champs        $this->id,        $this->file,        $this->url,        $this->tempFilename,        $this->alt    ));}public function unserialize($serialized){    list (        //tes champs        $this->id,        $this->file,        $this->url,        $this->tempFilename,        $this->alt    ) = unserialize($serialized);}

J'espere que ca t'aideras :)

Link to comment
Share on other sites

As-tu essayer a tout hasard de passer par un bundle genre celui ci :

 

http://knpbundles.com/dustin10/VichUploaderBundle

ou

http://knpbundles.com/sonata-project/SonataMediaBundle

 

Peux-etre que ca te permettras de resoudre  contourner ton probleme

 

Ah non c'est vrai pas du tout pensé à ça... En même temps utiliser un bundle alors qu'à la base quelques lignes de codes suffisent... :D

 

Bref, j'utiliserai pour mon autre projet je verrai bien merci ;)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...