/**
  * Handle a start session.
  *
  * @param  Request                                                   $request
  * @throws \SRIO\RestUploadBundle\Exception\UploadProcessorException
  * @return UploadResult
  */
 protected function handleStartSession(Request $request)
 {
     // Check that needed headers exists
     $this->checkHeaders($request, array('Content-Type', 'X-Upload-Content-Type', 'X-Upload-Content-Length'));
     $expectedContentType = 'application/json';
     if (substr($request->headers->get('Content-Type'), 0, strlen($expectedContentType)) != $expectedContentType) {
         throw new UploadProcessorException(sprintf('Expected content type is %s. Found %s', $expectedContentType, $request->headers->get('Content-Type')));
     }
     // Create the result object
     $result = new UploadResult();
     $result->setRequest($request);
     $result->setConfig($this->config);
     $result->setForm($this->form);
     $formData = array();
     if ($this->form != null) {
         // Submit form data
         $data = json_decode($request->getContent(), true);
         $formData = $this->createFormData($data);
         $this->form->submit($formData);
     }
     if ($this->form == null || $this->form->isValid()) {
         // Form is valid, store it
         $repository = $this->getRepository();
         $className = $repository->getClassName();
         // Create file from storage handler
         $file = $this->storageHandler->store($result, '', array(FileStorage::METADATA_CONTENT_TYPE => $request->headers->get('X-Upload-Content-Type')));
         /** @var $resumableUpload ResumableUploadSession */
         $resumableUpload = new $className();
         $resumableUpload->setData(serialize($formData));
         $resumableUpload->setStorageName($file->getStorage()->getName());
         $resumableUpload->setFilePath($file->getFile()->getName());
         $resumableUpload->setSessionId($this->createSessionId());
         $resumableUpload->setContentType($request->headers->get('X-Upload-Content-Type'));
         $resumableUpload->setContentLength($request->headers->get('X-Upload-Content-Length'));
         // Store resumable session
         $this->em->persist($resumableUpload);
         $this->em->flush($resumableUpload);
         // Compute redirect location path
         $location = $request->getPathInfo() . '?' . http_build_query(array_merge($request->query->all(), array(self::PARAMETER_UPLOAD_ID => $resumableUpload->getSessionId())));
         $response = new Response(null);
         $response->headers->set('Location', $location);
         $result->setResponse($response);
     }
     return $result;
 }
 /**
  * @param  Request                                                     $request
  * @return \SRIO\RestUploadBundle\Upload\UploadResult
  * @throws \Exception|\SRIO\RestUploadBundle\Exception\UploadException
  */
 public function handleRequest(Request $request)
 {
     // Check that needed headers exists
     $this->checkHeaders($request, array('Content-Length', 'Content-Type'));
     if (!$request->files->has($this->config[self::KEY_FIELD_FILE])) {
         throw new UploadException(sprintf('%s file not found', $this->config[self::KEY_FIELD_FILE]));
     }
     $response = new UploadResult();
     $response->setRequest($request);
     $response->setConfig($this->config);
     if ($this->form != null) {
         $response->setForm($this->form);
         if (!$request->request->has($this->config[self::KEY_FIELD_FORM])) {
             throw new UploadException(sprintf('%s request field not found in (%s)', $this->config[self::KEY_FIELD_FORM], implode(', ', $request->request->keys())));
         }
         $submittedValue = $request->request->get($this->config[self::KEY_FIELD_FORM]);
         if (is_string($submittedValue)) {
             $submittedValue = json_decode($submittedValue, true);
             if (!$submittedValue) {
                 throw new UploadException('Unable to decode JSON');
             }
         } elseif (!is_array($submittedValue)) {
             throw new UploadException('Unable to parse form data');
         }
         // Submit form data
         $formData = $this->createFormData($submittedValue);
         $this->form->submit($formData);
         if (!$this->form->isValid()) {
             return $response;
         }
     }
     /** @var $uploadedFile \Symfony\Component\HttpFoundation\File\UploadedFile */
     $uploadedFile = $request->files->get($this->config[self::KEY_FIELD_FILE]);
     $contents = file_get_contents($uploadedFile->getPathname());
     $file = $this->storageHandler->store($response, $contents, array(FileStorage::METADATA_CONTENT_TYPE => $uploadedFile->getMimeType()));
     $response->setFile($file);
     return $response;
 }
 /**
  * {@inheritDoc}
  *
  * @param  Request                                                     $request
  * @throws \Exception|\SRIO\RestUploadBundle\Exception\UploadException
  * @return \SRIO\RestUploadBundle\Upload\UploadResult
  */
 public function handleRequest(Request $request)
 {
     // Check that needed headers exists
     $this->checkHeaders($request);
     // Create the response
     $result = new UploadResult();
     $result->setRequest($request);
     $result->setConfig($this->config);
     $result->setForm($this->form);
     // Submit form data
     if ($this->form != null) {
         // Get formData
         $formData = $this->getFormData($request);
         $formData = $this->createFormData($formData);
         $this->form->submit($formData);
     }
     if ($this->form === null || $this->form->isValid()) {
         list($contentType, $content) = $this->getContent($request);
         $file = $this->storageHandler->store($result, $content, array(FileStorage::METADATA_CONTENT_TYPE => $contentType));
         $result->setFile($file);
     }
     return $result;
 }
 /**
  * @param  \Symfony\Component\HttpFoundation\Request                   $request
  * @throws \Exception|\SRIO\RestUploadBundle\Exception\UploadException
  * @param  Request                                                     $request
  * @return UploadResult
  */
 public function handleRequest(Request $request)
 {
     // Check that needed headers exists
     $this->checkHeaders($request, array('Content-Type'));
     $result = new UploadResult();
     $result->setForm($this->form);
     $result->setRequest($request);
     $result->setConfig($this->config);
     // Submit form data
     if ($this->form !== null) {
         $formData = $this->createFormData($request->query->all());
         $this->form->submit($formData);
     }
     if ($this->form == null || $this->form->isValid()) {
         $content = $request->getContent();
         // Nothing to store
         if (empty($content)) {
             throw new UploadException('There is no content to upload');
         }
         $file = $this->storageHandler->store($result, $content, array(FileStorage::METADATA_CONTENT_TYPE => $request->headers->get('Content-Type')));
         $result->setFile($file);
     }
     return $result;
 }