form_theme form_div_layout form custom change _self forms upload entity symfony-2.1

forms - form_div_layout - Formas Symfony. Subir archivo



symfony render form (3)

Comprueba tu archivo php.ini y asegúrate de que tanto el tamaño_perma_max como el archivo upload_max_filesize sean lo suficientemente grandes.

Intentando administrar la carga de archivos con Entity, pero obtengo este error:

Error fatal: llamada a una función miembro move () en un objeto no en /home/projectpath/src/BS/MyBundle/Entity/Items.php en la línea 327 Call Stack: 0.0002 333264 1. {main} () / home /projectpath/web/app_dev.php:0 0.0450 1158160 ...

Aquí está la clase de entidad:

namespace BS/BackstretcherBundle/Entity; use Doctrine/ORM/Mapping as ORM; use Symfony/Component/HttpFoundation/File/UploadedFile; use Symfony/Component/Validator/Constraints as Assert; /** * MB/MyBundle/Entity/Items * * @ORM/Table(name="items") * @ORM/Entity * @ORM/HasLifecycleCallbacks */ class Items { private $filenameForRemove; /** * @Assert/File(maxSize="60000000") */ public $file; ... protected function getUploadDir() { return ''images/items/''; } protected function getUploadRootDir() { return __DIR__.''/../../../../web/''.$this->getUploadDir(); } public function getWebPath() { return null === $this->file ? null : $this->getUploadDir().''/''.$this->getNameEn(); } public function getAbsolutePath() { return null === $this->file ? null : $this->getUploadRootDir().''/''.$this->getNameEn().''.jpg''; } /** * @ORM/PrePersist() * @ORM/PreUpdate() */ public function preUpload() { if (null !== $this->file) { $this->file = $this->getId() .''.''. $this->file->guessExtension(); } } /** * @ORM/PostPersist() * @ORM/PostUpdate() */ public function upload() { if (null === $this->file) { return; } $this->file->move($this->getUploadRootDir(), $this->file); unset($this->file); } /** * @ORM/PostRemove() */ public function removeUpload() { if ($file = $this->getAbsolutePath()) { unlink($file); } }

Y el controlador:

public function new_productAction(Request $request) { $product = new Items(); $product->setPrice(0); $form = $this->createFormBuilder($product) ->add(''Type'', ''choice'', array( ''choices'' => array(''1'' => ''Product'', ''0'' => ''Article''), ''required'' => false,)) ->add(''Price'', ''number'') ->add(''nameEn'', ''text'') ->add(''file'', ''file'', array(''label'' => ''Image'', ''required'' => true)) ->getForm(); if ($request->getMethod() == ''POST'') { if ($form->isValid()) { $form->bindRequest($request); $em = $this->getDoctrine()->getEntityManager(); $em->persist($product); $em->flush(); return new Response(''<html><body>Success!</body></html>''); } } return $this->render(''MyBundle:Default:admin_page.html.twig'', array( ''form'' => $form->createView(), )); }

Versión de Symfony: 2.1.0


es raro

su código está mal en su controlador. Debe vincular su solicitud a su formulario antes de la validación. Después de eso, puedes recuperar tus datos

if ($request->getMethod() == ''POST'') { //Note: bindRequest is now deprecated $form->bind($request); if ($form->isValid()) { //retrieve your model hydrated with your form values $product = $form->getData(); //has upload file ? if($product->getFile() instanceof UploadedFile){ //you can do your upload logic here wihtout doctrine event if you want } $em = $this->getDoctrine()->getEntityManager(); $em->persist($product); $em->flush(); return new Response(''<html><body>Success!</body></html>''); } }


Supongo que duke_nukem ya no está preocupado, 6 meses después, pero si alguien más se encuentra con esta pregunta, estaba teniendo exactamente el mismo problema y obtuve una gran respuesta aquí:

Error al subir archivos en Symfony 2

Parece duke_nukem y cometí el mismo error. El método preUpload () debería decir:

/** * @ORM/PrePersist() * @ORM/PreUpdate() */ public function preUpload() { if (null !== $this->file) { $this->path = $this->getId() .''.''. $this->file->guessExtension(); } }

El código actual convierte $this->file a una cadena, causando el error. La ruta debería estar asignada a $this->path .

Sybio en la otra pregunta descubrió esto, no yo. Solo quiero difundir el amor.