2012-07-02 194 views
0

我在保存從文件上載的教義中的路徑時遇到問題。我用這裏的例子:How to handle File Uploads with DoctrineSymfony2文件上傳:如何在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); 
    } 
} 
} 

我真的不知道如何將路徑保存到數據庫,以及如何調試。

感謝您的幫助!

回答

1

看看upload()方法。它有postPersist()這意味着實體更改不會保存到數據庫,因此更改的屬性將不會保存在當前保存中。

您必須使用prePersist註釋更新方法中的路徑,並使用postPersist在方法中移動文件。也不要取消設置%this->文件,只需分配空值。

基於你的類

/** 
* @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; 
} 

請記住,使用移動你應該使用服務器上的絕對路徑,例如/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(); 
} 
+0

謝謝,你能舉個簡單的例子嗎? – mbs

+0

是的,發佈更新 –

+0

我仍然沒有得到任何數據的路徑db字段,並沒有上傳文件,因爲變化 – mbs

相關問題