2016-09-13 2 views
0

Я только начинаю изучать Symfony 3, и я делаю блог. Я использую Doctrine Entities для взаимодействия с базой данных. Я нахожусь на Xampp на Mac OS.Symfony 3 не может перемещать загруженный файл

Я создал форму с вводом файла, но когда я хочу загрузить файл, он никогда не перемещается туда, где он должен, и в базе данных я записываю путь к временной папке Xampp.

Вот часть кода в файле Entity:

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')); 

Таким образом, вы будете иметь ваши методы в Entity выглядеть

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

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

Это было бы лучшим и наиболее подходящий способ сделать то, что вы хотите сделать. Надеюсь, поможет!