2016-09-13 68 views
0

我剛開始學習Symfony 3並且我做了一個博客。 我使用Doctrine Entities與數據庫進行交互。我在Mac OS上使用Xampp。Symfony 3不能移動上傳的文件

我創建了一個帶有文件輸入的表單,但是當我想上傳文件時,它永遠不會移動到它應該在的位置,並且在數據庫中記錄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() 
)); 
} 

有人可以看到問題在哪裏嗎?

回答

2

該代碼通常是確定的,但是您的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')); 

所以,你將有你在實體法樣子

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

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

這將是最好的,最合適的方式,做你想做的事情。希望能幫助到你!