ファイルアップロード用にsymfonyフォームを実装しました。フォームタイプは以下のようなものです
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', 'file', array(
'required' => false,
'label' => 'Upload Photo',
'label_attr' => array('class' => 'control-label')
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => '<path to entity>'
));
}
エンティティは以下のようなものです
//start upload config
/**
* @Assert\File(maxSize="5M")
*/
private $file;
/**
* @var string $photo
*
* @ORM\Column(type="string", nullable=true)
*/
private $photo;
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
//handle upload file
if (null !== $this->file) {
$filename = $this->getUsername();
// var_dump($filename);
$this->photo = $filename.'.'.$this->file->guessExtension();
}
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
//handle upload file gambar
if (null === $this->file) {
return;
} else {
$this->file->move($this->getUploadRootDir(), $this->photo);
unset($this->file);
}
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
//handle upload file gambar
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
/**
* Image upload
*/
public function getAbsolutePath()
{
return null === $this->photo ? null : $this->getUploadRootDir().'/'.$this->photo;
}
/**
* Image upload
*/
public function getWebPath()
{
return null === $this->photo ? null : $this->getUploadDir().'/'.$this->photo;
}
/**
* Image upload
*/
protected function getUploadRootDir()
{
return __DIR__.'/../../../../web/'.$this->getUploadDir();
}
/**
* Image upload
*/
protected function getUploadDir()
{
return 'foto';
}
そして、アクションの中は以下のようなものです
$entityItem->upload();
$this->em()->persist($entityItem);
$this->em()->flush();
フォームデータを送信しようとすると、以下のようなエラーが発生します
Could not move the file "/tmp/phpS3TVed" to
"<path to my entity folder>/../../../../web/foto"
(move_uploaded_file(): Unable to move '/tmp/phpS3TVed' to
'path to my entity folder>/../../../../web/foto')
このエラーの考えられる原因と、それを取り除く方法を教えてください。ありがとう。
アップデート
時々、upload() の呼び出しを削除しようとしました。それでも、メソッドはまったく呼び出されなくなりました。