Symfony 3无法移动上传的文件

时间:2016-09-13 07:08:39

标签: php doctrine symfony

我刚开始学习Symfony 3并且我开了一个博客。 我使用Doctrine Entities与数据库进行交互。我是Mac OS上的Xampp。

我创建了一个带有文件输入的表单,但是当我想上传文件时,它永远不会移动到应该的位置,在数据库中我会记录Xampp临时文件夹的路径。

以下是实体文件中代码的一部分:

public function getFile()
{
  return $this->file;
}

public function setFile(UploadedFile $file = null)
{
  $this->file = $file;
}

public function upload(){
  if(null === $this->file){
    return;
  }
  $name = $this->file->getClientOriginalName();

  $this->file->move($this->getUploadRootDir(), $name);
  $this->image = $name;
}

public function getUploadDir(){
  return 'uploads/img';
}

public function getUploadRootDir(){
  return '/../../../../web/'.$this->getUploadDir();
}

那是我的表单构建器:

class BlogType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('image', FileType::class)
            ->add('categorie', TextType::class)
            ->add('photographe', TextType::class)
            ->add('save', SubmitType::class)
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Boreales\PlatformBundle\Entity\Blog'
        ));
    }
}

来自控制器的addAction:

public function addAction(Request $request)
{
  //Création de l'entité
  $photo = new Blog();
  $form = $this->get('form.factory')->create(BlogType::class, $photo);

  if($request->isMethod('POST') && $form->handleRequest($request)->isValid()){
    $photo->upload();


    $em = $this->getDoctrine()->getManager();
    $em->persist($photo);
    $em->flush();

    $request->getSession()->getFlashBag()->add('notice', 'Photo enregistrée.');
    var_dump($photo->getImage());
    //return new Response('Coucou');
    //return $this->redirectToRoute('galerie');
  }
  return $this->render('BorealesPlatformBundle:Blog:add.html.twig', array(
    'form' => $form->createView()
  ));
}

有人能看出问题所在吗?

1 个答案:

答案 0 :(得分:3)

一般情况下代码都可以,但您的path存在问题。

你现在有这样的路径

return '/../../../../web/'.$this->getUploadDir();

从中删除前导斜杠

return '../../../../web/'.$this->getUploadDir();
开头的

正斜杠 root 目录。你不能超越它,它在顶层。

但是那也不会起作用,因为你需要一个绝对的目录路径。最好的方法是将此上传目录添加到config.yml

# app/config/config.yml

# ...
parameters:
    upload_directory: '%kernel.root_dir%/../web/uploads/img'

然后使用它。但是由于它的设计,您不能直接从Model层访问这些参数。因此,您需要将其传递给您正在呼叫的方法。

//your controller
$photo->upload($this->getParameter('upload_directory'));

因此,您将使实体中的方法看起来像

public function upload($path){
    if(null === $this->file){
        return;
    }
    $name = $this->file->getClientOriginalName();

    $this->file->move($path, $name);
    $this->image = $name;
}

这将是您做自己想做的最好也是最合适的方式。希望它有所帮助!