文件上传需要保存完整的PATH而不是相对

时间:2016-07-04 20:24:09

标签: php symfony

我正在构建一个简单的rest API端点,它需要一个文件。控制器获取文件并尝试使用它来持久化对象:

/**
 * @ORM\Column(name="file", type="string")
 *
 * @Assert\NotBlank()
 * @Assert\File()
 */
private $file;

首先,我生成一个文件名,然后将文件移动到它的最终文件夹。

$finalRoute = $this->getFileUploadFolder().'/'.$loggedInUser->getId() . '/';
$file->move($finalRoute, $fileName);

现在,当我将对象存储到数据库中时,我会执行以下操作:

$modelToPersist->setFile($fileName)

它不起作用,它确实返回:

  

[message:Symfony \ Component \ Validator \ ConstraintViolation:private] =>找不到该文件。

这是有道理的,因为URI不是完全限定的,它只是文件名。 但是,如果我将上面的代码更改为

$modelToPersist->setFile($finalRoute . $fileName);

确实有效。但是,数据库中保存的值是完全限定的URI,如:

  

/应用/ XAMPP / xamppfiles / htdocs中/ API /应用/../网/上传/ uploadedFile.txt

你可以想象,这个上面的URI可以解决这个问题,但它根本不可扩展,就好像我用上传移动文件夹一样,一切都搞砸了。不仅如此,此URI不是访问此资源的公共URL ...

我是否可以上传文件而无需指定完整的URI?我考虑过不使用@File注释,只考虑{{1} } field,但那么,注释的重点是什么?

1 个答案:

答案 0 :(得分:0)

如果要保存字符串,为什么断言File()?

文件符号仅用于移动上传,同时保存后不再需要它,优点是例如验证文件大小/ mime类型等。 你需要一些其他的属性来存储正确的“webpath”

以下是一些示例代码

public function getAbsolutePath()
{
    return null === $this->src
        ? null
        : $this->getUploadRootDir().'/'.$this->src;
}

public function getWebPath()
{
    return null === $this->src
        ? null
        : $this->getUploadDir().'/'.$this->src;
}

public function setWebPath()
{
    $this->webPath=$this->getWebPath();
    return $this;
}

public function getUploadRootDir()
{
    // The absolute directory path where uplaoded documents should be saved
    return __DIR__.'/../../../../web'.$this->getUploadDir();
}

public function getUploadDir()
{
    // Get rid of the __DIR__ so it doesn/t screw up when displaying uploaded doc/img in the view
    return '/uploads/documents';
}

/**
 * Sets file
 * 
 * @param UploadedFile $file
 */
public function setFile(UploadedFile $file = null)
{
    $this->file = $file;
}

public function upload()
{
    // the file property can be empty if the field is not required
    if (null === $this->getFile()) {
        return;
    }

    // unique file prepend
    $rand = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 5);

    // move takes the target directory and then the
    // target filename to move to
    $this->getFile()->move(
        $this->getUploadRootDir(),
          htmlspecialchars($rand.$this->getFile()->getClientOriginalName())
    );
    $this->src = htmlspecialchars($rand.$this->getFile()->getClientOriginalName());
    $this->setWebPath();

    // clean up the file property as you won't need it anymore
    $this->file = null;

}