Symfony 3不能移动上传的文件


Symfony 3 can't move uploaded file

我刚开始学习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()
  ));
}

有人能看出问题在哪里吗?

代码总体上是可以的,但是您的path有问题。

你现在有这样的路径

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

去掉开头的正斜杠

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

开头的正斜杠根目录。你不能在上面,它在顶层。

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

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

然后使用它。但是由于模型层的设计原因,您不能直接从模型层访问这些参数。所以你需要把它传递给你正在调用的方法。

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

所以你在Entity中的方法看起来就像

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

那将是做你想做的事的最好和最合适的方式。希望能有所帮助!