2017-08-27 112 views
0

我的目的是使用Sonata Media Bundle從Ionic App(現在使用PostMan進行測試)發送圖片到我的基於Symfony 3的數據庫。API Post to Sonata Media Bundle Symfony 3

他們是documentation但它很短,我堅持到15.3。發送媒體文件進程。

我設法得到Bundle中的後續流程並檢查數據。 c:\ wamp64 \ www \ bumblb ___ api \ vendor \ sonata-project \ media-bundle \ Controller \ Api \ MediaController.php> handleWriteMedium()函數。

/** 
* Write a medium, this method is used by both POST and PUT action methods. 
* 
* @param Request    $request 
* @param MediaInterface   $media 
* @param MediaProviderInterface $provider 
* 
* @return View|FormInterface 
*/ 
protected function handleWriteMedium(Request $request, MediaInterface $media, MediaProviderInterface $provider) 
{ 
    $form = $this->formFactory->createNamed(null, 'sonata_media_api_form_media', $media, array(
     'provider_name' => $provider->getName(), 
     'csrf_protection' => false, 
    )); 

    // return $media; 
    // return $request->__toString(); 

    // THE FORM DOES NOT FILL WITH REQUEST 
    $form->handleRequest($request); 
    return $form->getData(); 
    // return $media; 


    if ($form->isValid()) { 

     $media = $form->getData(); 
     $this->mediaManager->save($media); 

     $view = FOSRestView::create($media); 

     // BC for FOSRestBundle < 2.0 
     if (method_exists($view, 'setSerializationContext')) { 
      $serializationContext = SerializationContext::create(); 
      $serializationContext->setGroups(array('sonata_api_read')); 
      $serializationContext->enableMaxDepthChecks(); 
      $view->setSerializationContext($serializationContext); 
     } else { 
      $context = new Context(); 
      $context->setGroups(array('sonata_api_read')); 
      $context->setMaxDepth(0); 
      $view->setContext($context); 
     } 

     return $view; 
    } else { 
     // return "NOT VALID"; 
    } 

    return $form; 
} 

被稱爲是這樣一個:

/** 
* Adds a medium of given provider 
* If you need to upload a file (depends on the provider) you will need to do so by sending content as a multipart/form-data HTTP Request 
* See documentation for more details. 
* 
* @ApiDoc(
* resource=true, 
* input={"class"="sonata_media_api_form_media", "name"="", "groups"={"sonata_api_write"}}, 
* output={"class"="Sonata\MediaBundle\Model\Media", "groups"={"sonata_api_read"}}, 
* statusCodes={ 
*  200="Returned when successful", 
*  400="Returned when an error has occurred while medium creation", 
*  404="Returned when unable to find medium" 
* } 
*) 
* 
* @Route(requirements={"provider"="[A-Za-z0-9.]*"}) 
* 
* @param string $provider A media provider 
* @param Request $request A Symfony request 
* 
* @return MediaInterface 
* 
* @throws NotFoundHttpException 
*/ 
public function postProviderMediumAction($provider, Request $request) 
{ 
    $medium = $this->mediaManager->create(); 
    $medium->setProviderName($provider); 

    try { 
     $mediaProvider = $this->mediaPool->getProvider($provider); 
    } catch (\RuntimeException $ex) { 
     throw new NotFoundHttpException($ex->getMessage(), $ex); 
    } catch (\InvalidArgumentException $ex) { 
     throw new NotFoundHttpException($ex->getMessage(), $ex); 
    } 

    return $this->handleWriteMedium($request, $medium, $mediaProvider); 
} 

我選擇使用JSON與郵差做出來。表單數據似乎不起作用。

http://127.0.0.1:8000/api/providers/sonata.media.provider.image/media

{ 
"name": "nameex", 
"description": "descriptionex", 
"copyright": "copyrightex", 
"authorName": "authorNameex", 
"cdnIsFlushable": true, 
"enabled": true, 
"binaryContent": "data:image/jpeg;base64,test" 
} 

該型動物返回我寫的測試:

回報$形式 - >的getData();

{ 
     "provider_metadata": [], 
     "enabled": false, 
     "provider_name": "sonata.media.provider.image" 
    } 

return $ request - > __ toString();

"POST /api/providers/sonata.media.provider.image/media HTTP/1.1\r\nAccept:   */*\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\r\nAuthorization: Basic c3VwZXI6c3VwZXI=\r\nCache-Control: no-cache\r\nConnection:  keep-alive\r\nContent-Length: 201\r\nContent-Type: application/json\r\nHost:   127.0.0.1:8000\r\nOrigin:   chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop\r\nPhp-Auth-Pw:  super\r\nPhp-Auth-User: super\r\nPostman-Token: 16103fb6-3847-efe8-9cc6-7aa2a48b4ff9\r\nUser-Agent:  Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36\r\nX-Php-Ob-Level: 1\r\n\r\n{\n\t\"name\": \"namee\",\n\t\"description\": \"description\",\n\t\"copyright\": \"copyright\",\n\t\"authorName\": \"authorName\",\n\t\"cdnIsFlushable\": true,\n\t\"enabled\": true,\n\t\"binaryContent\": \"data:image/jpeg;base64,patata\"\n}" 

該請求似乎是確定的,但窗體沒有被填充它。我將這個請求與另一個正在工作的表單帖子進行比較,結構相同。

表單永遠不會有效,因爲vield「不應該是空白的」。

我可能會以另一種方式找到一個解決方案測試表單數據..試圖發送一個真正的baseEncode形象價值..

我知道這是一個非常特殊的情況,但如果有人是在這種情況下還是能提供我不同的觀點將是驚心動魄的。或者我將不得不放棄對媒體捆綁這是完全符合的,只是因爲該管理和接收:(

謝謝

+0

如果我使用POSTMAN的binarypart/form-data格式,以binaryContent作爲File,我有一個響應:意外''當我返回$ request__toString()時。 –

回答

0

溶液只是不重寫郵差頭Content-Type的使用時的工作表單數據格式類型。

重寫郵差的Content-Type使得POST是發送空..

我在郵差測試後,我用DATA_URL圖片格式它使用離子和MediaBundle API發送。(有Blob轉換和FormData javascript系統)

相關問題