使用带有Symfony RestApi的SonataMediaBundle使用FormType

时间:2017-06-19 11:35:07

标签: amazon-s3 fosrestbundle symfony-2.8 sonata-media-bundle

我在Symfony Rest API中使用SonataMediaBundle进行图像上传。我在json请求中发送base64Encoded映像,并在我的FormType中添加了以下代码:

$builder->add( 'subject' )
->add('promotionImage', 'sonata_media_type', array(
'provider' => 'sonata.media.provider.image',
'context' => 'offer',
'required'=>false,
'validation_groups' => 'Default'
));

我每次都没有为网站添加验证时发现验证错误。我每次都得到这个回复。

{
    "code": 400,
    "message": "Validation Failed",
    "errors": {
        "errors": [
            "This value is not valid."
        ],
        "children": {
            "emailSubject": {},

            "promotionImage": {
                "children": {
                    "binaryContent": {},
                    "unlink": {}
                }
            }
        }
    }
}

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。对于使用表单类型上传图像,我们需要添加PRE_SUBMIT事件侦听器,我们需要在其中解码图像内容并在临时位置上传该文件并将其传递给二进制内容,因为Sonata Media Bundle需要图像资源。我正在分享我的工作代码,如下所示。

 public function buildForm( FormBuilderInterface $builder, array $options )
    {
    $builder->->add(
                    'promotionImage',
                    'sonata_media_type',
                    array(
                        'provider' => 'sonata.media.provider.image',
                        'context'  => 'promotions',
                    )
                );
    $builder->addEventListener(
            FormEvents::PRE_SUBMIT,
            function ( FormEvent $event ) {
                $offer = $event->getData();

    if ( $offer[ 'promotionImage' ][ 'binaryContent' ] != '' ) {
            if ( preg_match('/data:([^;]*);base64,(.*)/', $offer[ 'promotionImage' ][ 'binaryContent' ])) {
                        $explodeImageData = explode( ',', $offer[ 'promotionImage' ][ 'binaryContent' ] );
                preg_match("/^data:image\/(.*);base64/i",$offer[ 'promotionImage' ][ 'binaryContent' ], $match);
                $extension = $match[1];
                $data = base64_decode( $explodeImageData[ 1 ] );
                $file = rtrim(sys_get_temp_dir(), '/') . '/' . uniqid() . '.' . $extension;
                file_put_contents( $file, $data );
                $offer[ 'promotionImage' ][ 'binaryContent' ] = UploadedFile( $file, $file );
                } else {
                            throw new \Exception( 'Binary Content is not valid' );
                        }
            }
}