Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File upload Symfony2文件上传:如何在doctrine中保存文件路径?_File Upload_Symfony_Doctrine Orm - Fatal编程技术网

File upload Symfony2文件上传:如何在doctrine中保存文件路径?

File upload Symfony2文件上传:如何在doctrine中保存文件路径?,file-upload,symfony,doctrine-orm,File Upload,Symfony,Doctrine Orm,我有一个问题,从文件上传保存在条令路径。我使用了下面的例子: 上传工作正常,但我没有将文件路径保存到数据库,我认为回调不起作用。至少我上传的文件没有扩展名 我的控制器来了: public function uploadAction() { $document = new Document(); //$form = $this->createForm(new DocumentType(), $entity); $form = $this->createFormBuilde

我有一个问题,从文件上传保存在条令路径。我使用了下面的例子:

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

我的控制器来了:

   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);
    }
 }
}
查看upload()方法。它有postPersist(),这意味着实体更改不会保存到DB,因此更改的属性不会存储在当前保存中

您必须使用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;
}
请记住,使用move应该在服务器上使用绝对路径,例如/var/www/my_-app/web/storage/uploads/file.jpg或C:\www\my_-app\web\storage\uploads\file.jpg(如果只使用“/”,则不用太担心斜线方向,它应该可以正常工作)


谢谢,你能举一个简短的例子吗?我仍然没有在路径数据库字段中获得任何数据,也没有上传文件,因为更改确定,我解决了问题。不知何故,preUpload函数不起作用。我在$this->file->move-in-upload函数之前粘贴了预上传内容,似乎从未调用过它。在将代码放入上传功能后,它工作了
public static function getUploadRootDir(){
    return $_SERVER['DOCUMENT_ROOT'].'/'.$this->getUploadDir(); 
}