我正在构建一个简单的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,但那么,注释的重点是什么?
答案 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;
}