2017-08-27 54 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系统)

相关问题