2017-06-19 69 views
0

我正在使用SonataMediaBundle在Symfony Rest API中上傳圖像。我在JSON請求發送base64Encoded圖片,並在我的FormType下面的代碼添加:使用SonataMediaBundle和Symfony RestApi使用FormType上傳S3上的圖像

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