/** * @ApiDoc( * resource=true, * description="Download a file test", * https=true, * requirements={ * {"name": "id", "dataType"="integer", "requirement"="\d+", "description"="Test id"}, * } * ) * @Route("/tests/{id}/download") * @ParamConverter("test", class="AppBundle:Test", options={"mapping": {"id": "id"}}) * @QueryParam(name="show", requirements="[01]", default="0", description="0: The file is downloaded, 1: The file is opened on the browser.") */ public function getTestDownloadAction(Test $test, ParamFetcher $paramFetcher) { $filename = sprintf("%s-%s-%s.%s", Slugger::slugify($test->getSubject()->getName()), Slugger::slugify($test->getSeason()), Slugger::slugify($test->getYear()), pathinfo($test->getFilename(), PATHINFO_EXTENSION)); $responseType = ResponseHeaderBag::DISPOSITION_ATTACHMENT; if ($page = $paramFetcher->get('show') === "1") { $responseType = ResponseHeaderBag::DISPOSITION_INLINE; } $fileToDownload = $this->get('vich_uploader.storage')->resolvePath($test, 'file'); $response = new BinaryFileResponse($fileToDownload); $response->trustXSendfileTypeHeader(); $response->setContentDisposition($responseType, $filename, iconv('UTF-8', 'ASCII//TRANSLIT', $filename)); $em = $this->getDoctrine()->getManager(); $test->incrementDownloads(); $em->persist($test); $em->flush(); return $response; }