代码之家  ›  专栏  ›  技术社区  ›  divHelper11

在symfony4中保存文件不起任何作用

  •  0
  • divHelper11  · 技术社区  · 6 年前

    我有一个页面,用户可以在其中上传图片。这些图片将在打开此页后全部加载,如果表单已提交,则将保存图片文件并与其余图片一起加载。

    这周我看了几十遍symfony的官方文档,我不明白为什么 function homeView() 什么也不做。

    我真正想要的是保存这个文件 /public/pictures 但不会发生。

    网站只是在刷新,没有错误信息或任何东西。我做错什么了吗?

    自动控制器 文件:

    <?php
    
    namespace App\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\Form\Extension\Core\Type\FileType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\HttpFoundation\File\Exception\FileException;
    use Symfony\Component\HttpFoundation\Response;
    use App\Service\PicturesService;
    use App\Entity\Picture;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    
    class HomeController extends AbstractController
    {
        public function homeView()
        {
            $pictures = $this->getDoctrine()
                ->getRepository(Picture::class)
                ->findAll();
    
            $form = $this->createFormBuilder()
                ->add('file', FileType::class)
                ->add('save', SubmitType::class)
                ->getForm();
    
            if ($form->isSubmitted() && $form->isValid()) {
    
                $formData = $form->getData();
    
                try {
                    $formData->file->move(
                        $this->getParameter('pictures_directory'),
                        'file_name');
                }
    
                catch (FileException $e) {
                    return new Response($e);
                }
    
                /*
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($db_file_url);
                $entityManager->flush();
                */
            }
    
            return $this->render('home.html.twig', array(
                'form' => $form->createView(),
                'pictures' => $pictures));
        }
    }
    

    服务业协会 文件:

    parameters:
        locale: 'en'
        pictures_directory: '%kernel.project_dir%/public/pictures'
    services:
        _defaults:
            autowire: true      
            autoconfigure: true
        App\:
            resource: '../src/*'
            exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
        App\Controller\:
            resource: '../src/Controller'
            tags: ['controller.service_arguments']
    

    枝杈风景 形式:

    {{ form(form) }}
    {{ form_widget(form) }}
    {{ form_end(form) }}
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   mvdgun    6 年前

    首先,你的代码永远不会到达第一个的内部代码 if 由于表单未提交,在控制器中的语句。在表单实例化下面添加以下行:

    $form->handleRequest($request);
    

    要使表单处理工作,需要键入hint Symfony\Component\HttpFoundation\Request 对象作为参数 homeView() 方法:

    public function homeView(Symfony\Component\HttpFoundation\Request $request)
    

    提交表单后,您将遇到以下错误:

    注意:正在尝试获取非对象的属性“file”

    出现该错误的原因是 getData() 你的方法 $form 对象返回数组,而不是对象。您需要访问 file 元素并调用 move() 方法:

    $formData = $form->getData();
    
    /** @var UploadedFile $file */
    $file = $formData['file'];
    $file->move('var/files', 'file_name');