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.