0

Mein Zweck ist es, ein Bild von einer Ionic App (zum Testen mit PostMan) an meine Symfony 3-basierte Datenbank mit Sonata Media Bundle zu senden.API Post zu Sonata Media Bundle Symfony 3

Ihr ist ein documentation aber es ist ziemlich kurz und ich bin am 15.3 fest. SENDING A MEDIA FILE-Prozess.

Ich schaffte es, den folgenden Prozess im Bundle zu bekommen und Daten zu inspizieren. c: \ wamp64 \ www \ bumblb ___ api \ Hersteller \ sonata-project \ media-bundle \ Controller \ Api \ MediaController.php> Funktion 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; 
} 

Welche sei diese aufgerufen wird:

/** 
* 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); 
} 

ich wählen, um es mit JSON mit POSTMAN zu machen. Formulardaten scheinen nicht zu funktionieren.

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" 
} 

den differents zurückkehren, dass ich zu Test schreiben:

return $ form-> getData();

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

zurückgeben $ 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}" 

Die Anfrage scheint in Ordnung zu sein, aber das Formular wird nicht ausgefüllt. Ich vergleiche die Anfrage mit einem anderen Formular-Post, der funktioniert, es ist die gleiche Struktur.

Das Formular ist nie gültig, weil vield "sollte nicht leer sein".

Ich werde ein Lösung Testen von Formulardaten in einer anderen Art und Weise finden kann .. Den Versuch, einen echten baseEncode Bildwert zu senden ..

Ich weiß, es ist ein sehr spezieller Fall aber wenn jemand in diesem Fall war oder konnte mir einen anderen Blickwinkel zu bieten, wäre wunderbar. Oder ich werde auf Medien Bundle verzichten, die perfekt arbeitet mit dem Server-Betreiber und der Empfang nur wegen der, dass :(

Danke

+0

Wenn ich multipart/Formulardatenformat mit POSTMAN verwende, habe ich mit binaryContent als Datei eine Antwort, die lautet: Unerwartet, wenn ich $ request__toString() zurückgebe. –

Antwort

0

Die Lösung wurde nur nicht POSTMAN Header Content-Type außer Kraft setzen bei der Verwendung von Form-Datentyp-Format.

Zwingende POSTMAN Content-Type macht der POST leer sein senden ..

nach meinen Tests in Postman, ich DATA_URL Bildformat verwendet es Ionen und die MediaBundle API zu senden. (mit Blob-Konvertierung und FormData-Javascript-System)