0

我在从文件上传中保存学说中的路径时遇到问题。我使用了这里的例子:How to handle File Uploads with Doctrine

上传工作,但我没有得到保存到数据库的文件路径,我认为回调不起作用。至少我的上传没有文件扩展名。

我的控制器来了:

   public function uploadAction()
{
$document = new Document();
//$form   = $this->createForm(new DocumentType(), $entity);


$form = $this->createFormBuilder($document)
    ->add('name')
    ->add('file')
    ->getForm()
;
if ($this->getRequest()->getMethod() === 'POST') {
    $form->bindRequest($this->getRequest());
    if ($form->isValid()) {

        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($document);
        $em->flush();

        $this->redirect($this->generateUrl('document'));
    }
}

return  $this->render("ISClearanceBundle:Document:upload.html.twig",array('form' =>   $form->createView()));
}

这是实体:

 <?php

   namespace IS\ClearanceBundle\Entity;

   use Doctrine\ORM\Mapping as ORM;
   use Symfony\Component\HttpFoundation\File\UploadedFile;
   use Symfony\Component\Validator\Constraints as Assert;

  /**
   * IS\ClearanceBundle\Entity\Document
   * @ORM\Entity
   * @ORM\HasLifecycleCallbacks
   */
  class Document
 {
 /**
  * @var string $name
  */
private $name;

/**
 *  @ORM\Column(type="string", length=255, nullable=true)
 */
public $path;

/**
 * @var integer $projectId
 */
private $projectId;

/**
 * @var integer $id
 */
private $id;

 /**
 * @Assert\File(maxSize="6000000")
 */
public $file;

/**
 * Set name
 *
 * @param string $name
 */
public function setName($name)
{
    $this->name = $name;
}

/**
 * Get name
 *
 * @return string
 */
public function getName()
{
    return $this->name;
}

/**
 * Set path
 *
 * @param integer $path
 */
public function setPath($path)
{
    $this->path = $path;
}

/**
 * Get path
 *
 * @return integer
 */
public function getPath()
{
    return $this->path;
}

/**
 * Set projectId
 *
 * @param integer $projectId
 */
public function setProjectId($projectId)
{
    $this->projectId = $projectId;
}

/**
 * Get projectId
 *
 * @return integer
 */
public function getProjectId()
{
    return $this->projectId;
}

/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

 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/documents';
}

/**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */
public function preUpload()
{
    if (null !== $this->file) {
        // do whatever you want to generate a unique name
        $this->path = uniqid().'.'.$this->file->guessExtension();
    }
        $this->path = uniqid().'.'.$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);
    $this->setPath($this->path);
    unset($this->file);
}

/**
 * @ORM\PostRemove()
 */
public function removeUpload()
{
    if ($file = $this->getAbsolutePath()) {
        unlink($file);
    }
 }
}

我真的不知道如何保存到数据库的路径以及如何调试。

谢谢你的帮助!

4

1 回答 1

1

查看 upload() 方法。它具有 postPersist() ,这意味着实体更改不会保存到 DB,因此更改的属性不会存储在当前保存中。

您必须使用 prePersist 注释更新方法中的路径并使用 postPersist 在方法中移动文件。也不要取消设置 %this->file,只需分配空值。

基于你的班级

/**
 * @ORM\PrePersist()
 */
public function preUpload()
{
    if (null !== $this->file) {
        // do whatever you want to generate a unique name
        $this->path = uniqid().'.'.$this->file->guessExtension();
    }
}

/**
 * @ORM\PostPersist()
 */
public function upload()
{
     if (null === $this->file) {
         return;
     }

     $this->file->move($this->getUploadRootDir(), $this->path);
     $this->file = null;
}

请记住,使用 move 应该在您的服务器上使用绝对路径,例如 /var/www/my_app/web/storage/uploads/file.jpg 或 C:\www\my_app\web\storage\uploads\file.jpg (不要不要太担心斜线方向,如果你只使用“/”它应该可以正常工作)

public static function getUploadRootDir(){
    return $_SERVER['DOCUMENT_ROOT'].'/'.$this->getUploadDir(); 
}  
于 2012-07-02T12:26:53.003 回答