0

私はSymfony Rest APIで画像をアップロードするためにSonataMediaBundleを使用しています。私は、JSONリクエストにbase64Encodedイメージを送信し、私にformTypeにコードの下に追加しています:SonataMediaBundleを使用してS3で画像をアップロードし、FormTypeを使用してSymfony RestApiを使用

$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": {} 
       } 
      } 
     } 
    } 
} 

大変お手伝いします。

答えて

0

私はこの問題を解決しました。フォームタイプを使用して画像をアップロードする場合は、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'); 
         } 
      } 
} 
関連する問題