【问题标题】:Symfony3 wont convert file to UploadedFileSymfony3 不会将文件转换为 UploadedFile
【发布时间】:2017-02-06 23:48:19
【问题描述】:

我正在关注本教程http://symfony.com/doc/current/controller/upload_file.html,但 $file 没有被转换为 UploadedFile,它仍然是一个字符串:

var_dump($file);
/home/owner/Desktop/Workspace/Documentary/src/DW/DocumentaryBundle/Controller/Admin/DocumentaryController.php:103:string '/tmp/phpmmv1LP' (length=14)

类型错误:传递给 DW\DocumentaryBundle\Uploader\PosterUploader::upload() 的参数 1 必须是 Symfony\Component\HttpFoundation\File\UploadedFile 的实例,给定字符串,在 /home/owner/Desktop/Workspace 中调用/DocumentaryWIRE/src/DW/DocumentaryBundle/Controller/Admin/DocumentaryController.php 第 106 行

创建动作:

     /**
     * @param Request $request
     * @return Response
     */
    public function createAction(Request $request)
    {
        $documentary = new Documentary();

        $form = $this->createForm(DocumentaryType::class, $documentary);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $file = $documentary->getPoster();

            $posterUploader = $this->getPosterUploader();
            $fileName = $posterUploader->upload($file);

            $documentary->setPoster($fileName);

            $documentaryService = $this->getDocumentaryService();
            $documentaryService->save($documentary);
        }

        return $this->render('DocumentaryBundle:Admin:create.html.twig', array(
            'form' => $form->createView(),
        ));
    }

查看

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

表格:

<?php

namespace DW\DocumentaryBundle\Form;

use DW\DocumentaryBundle\Entity\Documentary;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class DocumentaryType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class)
            ->add('storyline', TextareaType::class)
            ->add('summary', TextareaType::class)
            ->add('year', IntegerType::class)
            ->add('length', IntegerType::class)
            ->add('status', TextType::class)
            ->add('views', IntegerType::class)
            ->add('shortUrl', TextType::class)
            ->add('videoId', TextType::class)
            ->add('videoSource', TextType::class)
            ->add('poster', FileType::class, [
                'label' => 'Poster'])
            ->add('category', EntityType::class, [
                'class' => 'CategoryBundle:Category',
                'choice_label' => 'name',
            ])
            ->add('submit', SubmitType::class);
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Documentary::class,
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return "documentary";
    }
}

控制器:

<?php

namespace DW\DocumentaryBundle\Uploader;

use Symfony\Component\HttpFoundation\File\UploadedFile;

class PosterUploader
{
    /**
     * @var string
     */
    private $targetDir;

    /**
     * @param string $targetDir
     */
    public function __construct(string $targetDir)
    {
        $this->targetDir = $targetDir;
    }

    /**
     * @param UploadedFile $file
     * @return string
     */
    public function upload(UploadedFile $file)
    {
        $fileName = md5(uniqid()).'.'.$file->guessExtension();

        $file->move($this->targetDir, $fileName);

        return $fileName;
    }
}

【问题讨论】:

  • 看看this answer和你的比较,看看差异(如果有的话),并相应地修改。
  • 显然,Documentary 类的 getPosterUploader() 方法返回一个字符串。你能显示它的代码吗?

标签: php symfony


【解决方案1】:

文档没有错误!他们在示例中没有使用类型提示:

// src/AppBundle/Entity/Product.php
public function setBrochure($brochure)
{
    $this->brochure = $brochure;

    return $this;
}

当您使用string 类型提示时,将调用 UploadedFile::__toString()! 所以检查你的实体。应该是这样的:

public function setPoster($poster)
{
   // ...
}

【讨论】:

  • 有史以来最合乎逻辑的最佳答案。我怎么会错过那个小细节...谢谢!
【解决方案2】:

要从请求中获取文件,在 Symfony 中,您需要获取 $request->files。例如$request-&gt;files-&gt;get('file_name');

【讨论】:

    【解决方案3】:

    文档有误,应该是:$file = $form-&gt;get('poster')-&gt;getData();

    /**
         * @param Request $request
         * @return Response
         */
        public function createAction(Request $request)
        {
            $documentary = new Documentary();
    
            $form = $this->createForm(DocumentaryType::class, $documentary);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $file = $form->get('poster')->getData();
    
                $posterUploader = $this->getPosterUploader();
                $fileName = $posterUploader->upload($file);
    
                $documentary->setPoster($fileName);
    
                $documentaryService = $this->getDocumentaryService();
                $documentaryService->save($documentary);
            }
    
            return $this->render('DocumentaryBundle:Admin:create.html.twig', [
                'form' => $form->createView(),
            ]);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      相关资源
      最近更新 更多