在Symfony 3

时间:2017-11-19 11:43:44

标签: php symfony file-upload

我想在Symfony 3中创建一个包含多个文件上传的表单,但它无法正常工作,我的控制器出错:

  

类型" Doctrine \ Common \ Collections \ Collection | array"的预期值对于关联字段" SGBundle \ Entity \ Album#$ images",得到" Symfony \ Component \ HttpFoundation \ File \ UploadedFile"代替。

我有2个实体:Album.php和带有OneToMany关系的Image.php(一张专辑有几张图片)。

我的图片已成功上传到我的文件夹,但我无法将其插入我的数据库。

以下是我的控制器中代码中最重要的部分:

$images = $album->getImages();

        foreach ($images as $image) {

            $fileName = md5(uniqid('img_album_', true));
            $fileExtension = $image->guessExtension();
            $nomImageComplet = $fileName . '.' . $fileExtension;

            $image->move(
                $this->getParameter('albums_images_directory'),
                $nomImageComplet
            );

            $tinified = fromFile($this->getParameter('albums_images_directory') . '/' . $nomImageComplet);
            $tinified->toFile($this->getParameter('albums_images_directory') . '/' . $nomImageComplet);

            $img = new Image();
            $img->setExtension($fileExtension);
            $img->setFile($fileName);

            $em->persist($img);
            $em->flush();
        }

我的FormType:

    /**
 * Class AlbumType
 *
 * @package SGBundle\Form
 */
class AlbumType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->
        add('titre', TextType::class, [
                       'attr' => [
                           'placeholder' => 'Titre de l\'album (140 caractères max) *',
                       ],
                   ])
        ->add('miniature', FileType::class, [
                       'attr' => [
                           'placeholder' => 'Miniature de l\'album *',
                       ], 'required' => false, 'data_class' => null,
                   ])
        ->add('images', FileType::class, [
            'attr' => [
                'placeholder' => 'Images de l\'album *',
                'accept' => 'image/*',
                'multiple' => 'multiple'
            ], 'required' => false, 'data_class' => null, 'multiple' => true,
        ])
        ->add('envoyer', SubmitType::class)
        ->add('annuler', ResetType::class);
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            [
                'data_class' => Album::class,
            ]
        );
    }

提前感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您的images属性应该是这样的

->add('images', CollecionType::class, [
'entry_type' => ImageType::class,
'allow_add' => true,
'allow_delete' => true

])

然后你的ImageType :: class应该是这样的

->add('image', FileType::class, [
'attr' => [
    'placeholder' => 'Images de l\'album *',
    'accept' => 'image/*',
    'multiple' => 'multiple
], 'required' => false, 'data_class' => null, 'multiple' => true,])