/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->file) {
$this->path = $this->file->guessExtension();
}
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}
// you must throw an exception here if the file cannot be moved
// so that the entity is not persisted to the database
// which the UploadedFile move() method does
$this->file->move($this->getUploadRootDir(), $this->id.'.'.$this->file->guessExtension());
unset($this->file);
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
public function getAbsolutePath()
{
return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->id.'.'.$this->path;
}
嗨,在这个cose我上传文件 当我将文件名id保存到目录中时,所有工作,但进入数据库只保存jpg ...没有id
答案 0 :(得分:2)
在预持续生命周期回拨中,您的实体在调用时尚未分配ID $this->id.'.'.$this->file->guessExtension()
,$this->id
将为null
您已正确遵循食谱中的示例。它没有提到存储在路径下的数据库中的唯一东西将是扩展。这无关紧要,因为文件名始终是与扩展名连接的id。即$filename = $this->id . $this->path
如果您希望存储在路径下的字符串准确表示文件名,则必须考虑不同的命名策略。
答案 1 :(得分:0)
在preUpload方法中,只是将扩展文件影响到path属性。所以,在你的数据库中你只有jpg扩展名是正常的。
编辑:在preUpload方法中,ID尚未受到ORM的影响,因此您无法使用它来生成文件名。 IMO,你应该使用uniquid来生成一个唯一的文件名。像$this->path = uniquid().'.'.$this->file->guessExtension()
答案 2 :(得分:0)
好吧我曾经遇到过同样的问题(仅限.txt)。
如果你的文件名中有特殊字符,我认为这可能是一个问题。
我用这种方式解决了这个问题: $filepath = $this->file->getClientOriginalName();
$filepath = str_replace(array('/', ' ', '-', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß'), array('_', '_', '', 'ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue', 'ss'), $filepath);
$this->path = $filepath;
希望这是你的问题的答案,如果它还没有解决:D