2016-09-13 8 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; 
} 

ように見えています。それが役に立てば幸い!

関連する問題