subir - symfony2 upload file example
archivo symfony2 perdido en el error de formulario (2)
No puede, por razones de seguridad, establecer un archivo para el campo de carga. Vea aqui para mas informacion. ¿Cómo establecer el valor de un campo de archivo HTML?
Estoy utilizando una implementación estándar de carga de archivos en relación con la doctrina, según el ejemplo en los tutoriales del sitio web symfony2.
Cuando mi formulario de carga encuentra un error en la validación y envía al usuario de vuelta al formulario con mensajes de error, pierde el archivo elegido para cargarlo, aunque si var_dump my $ entity-> file puedo ver que tiene el archivo ... .
//if form is valid, do some stuff... if not:
else {
//var_dump($entity->file); //This works, I get my file
//die;
//Get and check the folder chosen as parent
$entity->setFolder( $this->checkFolderId($request->request->get(''folder'')) ); //will cause die() if folder doesn''t belong to this company
$folders = $this->getFolders();
return $this->render(''BizTVMediaManagementBundle:Image:new.html.twig'', array(
''entity'' => $entity,
''form'' => $form->createView(),
''folders'' => $folders,
''fileExists'' => $fileExists,
));
}
Después de poner esto en la vista de ramita, no hay nada en el campo de archivo.
Aquí está mi entidad ...
<?php
namespace BizTV/MediaManagementBundle/Entity;
use Doctrine/ORM/Mapping as ORM;
use Symfony/Component/Validator/Constraints as Assert;
/**
* BizTV/MediaManagementBundle/Entity/Image
*
* @ORM/Table(name="image")
* @ORM/Entity
* @ORM/HasLifecycleCallbacks
*/
class Image
{
/**
* @var integer $id
*
* @ORM/Column(name="id", type="integer")
* @ORM/Id
* @ORM/GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $name
*
* @ORM/Column(name="name", type="string", length=255)
* @Assert/NotBlank
*/
private $name;
/**
* @var integer $width
*
* @ORM/Column(name="width", type="integer")
*/
private $width;
/**
* @var integer $height
*
* @ORM/Column(name="height", type="integer")
*/
private $height;
/**
* @ORM/Column(type="string", length=255, nullable=true)
*/
private $path;
/**
* @var object BizTV/BackendBundle/Entity/company
*
* @ORM/ManyToOne(targetEntity="BizTV/BackendBundle/Entity/company")
* @ORM/JoinColumn(name="company", referencedColumnName="id", nullable=false)
*/
protected $company;
/**
* @var object BizTV/MediaManagementBundle/Entity/Folder
*
* @ORM/ManyToOne(targetEntity="BizTV/MediaManagementBundle/Entity/Folder")
* @ORM/JoinColumn(name="folder", referencedColumnName="id", nullable=true)
*/
protected $folder;
/**
* @Assert/File(maxSize="6000000")
*/
public $file;
/**
* @ORM/PrePersist()
* @ORM/PreUpdate()
*/
public function preUpload()
{
if (null !== $this->file) {
// do whatever you want to generate a unique name
$this->path = sha1(uniqid(mt_rand(), true)).''.''.$this->file->guessExtension();
}
}
/**
* @ORM/PostPersist()
* @ORM/PostUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}
// if there is an error when moving the file, an exception will
// be automatically thrown by move(). This will properly prevent
// the entity from being persisted to the database on error
$this->file->move($this->getUploadRootDir(), $this->path);
unset($this->file);
}
/**
* @ORM/PostRemove()
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
public function getAbsolutePath()
{
return null === $this->path ? null : $this->getUploadRootDir().''/''.$this->path;
}
public function getWebPath()
{
return null === $this->path ? null : $this->getUploadDir().''/''.$this->path;
}
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 when displaying uploaded doc/image in the view.
return ''uploads/images'';
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set width
*
* @param integer $width
*/
public function setWidth($width)
{
$this->width = $width;
}
/**
* Get width
*
* @return integer
*/
public function getWidth()
{
return $this->width;
}
/**
* Set height
*
* @param integer $height
*/
public function setHeight($height)
{
$this->height = $height;
}
/**
* Get height
*
* @return integer
*/
public function getHeight()
{
return $this->height;
}
/**
* Set path
*
* @param string $path
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* Set company
*
* @param BizTV/BackendBundle/Entity/company $company
*/
public function setCompany(/BizTV/BackendBundle/Entity/company $company)
{
$this->company = $company;
}
/**
* Get company
*
* @return BizTV/BackendBundle/Entity/company
*/
public function getCompany()
{
return $this->company;
}
/**
* Set folder
*
* @param BizTV/MediaManagementBundle/Entity/Folder $folder
*/
public function setFolder(/BizTV/MediaManagementBundle/Entity/Folder $folder = NULL)
{
$this->folder = $folder;
}
/**
* Get folder
*
* @return BizTV/MediaManagementBundle/Entity/Folder
*/
public function getFolder()
{
return $this->folder;
}
}
Y la forma:
<?php
namespace BizTV/MediaManagementBundle/Form;
use Symfony/Component/Form/AbstractType;
use Symfony/Component/Form/FormBuilder;
class ImageType extends AbstractType
{
function __construct($createAction=0) {
$this->createAction = $createAction;
}
public function buildForm(FormBuilder $builder, array $options)
{
$createAction = $this->createAction;
if ($createAction) {
$builder
->add(''file'')
;
}
$builder
->add(''name'', ''text'', array(''label'' => ''Namn''))
;
}
public function getName()
{
return ''biztv_mediamanagementbundle_imagetype'';
}
}
Sugiero que está intentando acceder a la propiedad del archivo de su entidad en ramitas. Por favor, eche un vistazo rápido a su función de carga.
/**
* @ORM/PostPersist()
* @ORM/PostUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}
// if there is an error when moving the file, an exception will
// be automatically thrown by move(). This will properly prevent
// the entity from being persisted to the database on error
$this->file->move($this->getUploadRootDir(), $this->path);
unset($this->file);
}
Como puede ver, la propiedad del archivo se desconecta después de que se haya completado la operación de carga y persistencia.
Ahora, para que twig muestre su imagen real, debe usar la propiedad webPath ya que esta es la url generada para su imagen recién cargada.
La carga de archivos se puede manejar un poco más fácilmente con Dustin10 / VichUploaderBundle, que también admite la abstracción del sistema de archivos con KnpLabs / Gaufrette .
Espero que esto ayude :)