TemporaryFileController.php (4600B)
1 <?php 2 3 namespace PartKeepr\UploadedFileBundle\Controller; 4 5 use Dunglas\ApiBundle\Action\ActionUtilTrait; 6 use Dunglas\ApiBundle\Api\ResourceInterface; 7 use FOS\RestBundle\Controller\Annotations\RequestParam; 8 use FOS\RestBundle\Controller\Annotations\View; 9 use Nelmio\ApiDocBundle\Annotation\ApiDoc; 10 use PartKeepr\ImageBundle\Response\TemporaryImageUploadResponse; 11 use PartKeepr\UploadedFileBundle\Entity\TempUploadedFile; 12 use Symfony\Component\HttpFoundation\File\File; 13 use Symfony\Component\HttpFoundation\File\UploadedFile; 14 use Symfony\Component\HttpFoundation\JsonResponse; 15 use Symfony\Component\HttpFoundation\Request; 16 use Symfony\Component\HttpFoundation\Response; 17 18 class TemporaryFileController extends FileController 19 { 20 use ActionUtilTrait; 21 22 /** 23 * Handles a temporary file upload. 24 * 25 * @RequestParam(name="url",description="An URL where the file is located",strict=false) 26 * @ApiDoc(section="file",output="PartKeepr\UploadedFileBundleBundle\Response\TemporaryFileUploadResponse") 27 * @View() 28 * 29 * @param Request $request The request to process 30 * 31 * @throws \Exception An exception if neither the userfile form parameter or an URL was given 32 * 33 * @return JsonResponse The JSON response from the temporary file upload 34 */ 35 public function uploadAction(Request $request) 36 { 37 $uploadedFile = new TempUploadedFile(); 38 $fileService = $this->get('partkeepr_uploadedfile_service'); 39 40 if ($request->files->has('userfile') && $request->files->get('userfile') != null) { 41 /** 42 * @var UploadedFile 43 */ 44 $file = $request->files->get('userfile'); 45 if (!$file->isValid()) { 46 switch ($file->getError()) { 47 case UPLOAD_ERR_INI_SIZE: 48 $error = $this->get('translator')->trans('The uploaded file is too large.'); 49 break; 50 default: 51 $error = $this->get('translator')->trans( 52 'Unknown error, error code %code', 53 ['code' => $file->getError()] 54 ); 55 break; 56 } 57 58 throw new \Exception($error); 59 } 60 61 if ($this->container->hasParameter("partkeepr.upload.limit") && 62 $this->container->getParameter("partkeepr.upload.limit") !== false && 63 $file->getSize() > $this->container->getParameter("partkeepr.upload.limit")) { 64 throw new \Exception($this->get('translator')->trans('The uploaded file is too large.')); 65 } 66 67 /** 68 * @var $file UploadedFile 69 */ 70 $fileService->replace($uploadedFile, new File($file->getPathname())); 71 $uploadedFile->setOriginalFilename($file->getClientOriginalName()); 72 } elseif ($request->request->has('url')) { 73 $fileService->replaceFromURL($uploadedFile, $request->request->get('url')); 74 } else { 75 throw new \Exception($this->get('translator')->trans('No valid file given')); 76 } 77 78 if ($request->request->has("description")) { 79 $uploadedFile->setDescription($request->request->get("description")); 80 } 81 82 $this->getDoctrine()->getManager()->persist($uploadedFile); 83 $this->getDoctrine()->getManager()->flush(); 84 85 /** 86 * @var ResourceInterface 87 */ 88 list($resourceType) = $this->extractAttributes($request); 89 90 $serializedData = $this->get('serializer')->normalize( 91 $uploadedFile, 92 'jsonld', 93 $resourceType->getNormalizationContext() 94 ); 95 96 return new JsonResponse(new TemporaryImageUploadResponse($serializedData)); 97 } 98 99 /** 100 * Uploads a webcam image. 101 * 102 * @param Request $request The request to process 103 * 104 * @return Response 105 */ 106 public function webcamUploadAction(Request $request) 107 { 108 $file = new TempUploadedFile(); 109 $fileService = $this->get('partkeepr_uploadedfile_service'); 110 111 $data = $request->getContent(); 112 113 $base64 = explode(',', $data); 114 $fileService->replaceFromData($file, base64_decode($base64[1]), 'webcam.png'); 115 116 $this->getDoctrine()->getManager()->persist($file); 117 $this->getDoctrine()->getManager()->flush(); 118 119 return $file; 120 } 121 122 /** 123 * {@inheritdoc} 124 */ 125 protected function getEntityClass() 126 { 127 return 'PartKeepr\\UploadedFileBundle\\Entity\\TempUploadedFile'; 128 } 129 }