使用 Symfony Rest Api 使用 Symfony Media Bundle 使用 FormType 在 S3 上上传图像

Upload Image on S3 using SonataMediaBundle with Symfony RestApi using FormType

我正在使用 SonataMediaBundle 在 Symfony Rest 中上传图片 API。我在 json 请求中发送 base64Encoded Image 并在我的 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": {}
                }
            }
        }
    }
}

非常感谢您的帮助。

我已经解决了这个问题。对于使用表单类型上传图片,我们需要添加 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' );
                        }
            }
}