0

J'utilise SonataMediaBundle pour télécharger des images dans Symfony Rest API. J'envoie base64Encoded image dans la demande de JSON et ajouté ci-dessous le code dans mon FormType:Télécharger l'image sur S3 en utilisant SonataMediaBundle avec Symfony RestApi en utilisant FormType

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

Je trouve erreur de validation à chaque fois alors que je ne l'ai pas ajouté de validation pour le site. Je reçois cette réponse à chaque fois.

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

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

Vous aide est très apprécié.

Répondre

0

J'ai résolu ce problème. Pour télécharger des images en utilisant le type de formulaire, nous devons ajouter un écouteur d'événement PRE_SUBMIT, dans lequel nous devons décoder le contenu de l'image et télécharger ce fichier sur l'emplacement temporaire et le transmettre en contenu binaire car Sonata Media Bundle a besoin de ressources image. Je partage mon code de travail comme ci-dessous pour la référence.

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'); 
         } 
      } 
}