/** * @Route("/album/{id}/download", requirements={ * "id": "\d+" * }) * @Method({"GET", "OPTIONS"}) */ public function downloadAlbumAction(Request $request, Album $album) { // Verify token $secret = $uploadDir = $this->getParameter('secret') . '54 90df2!!fh++ gGZ)='; $date = new \DateTime(); $time = $date->format('d-m-Y H:i'); $correct = hash('sha256', $secret . $time . $album->getId()); $token = $request->query->get('token'); if ($token === null) { $token = ''; } if (!hash_equals($correct, $token)) { return new JsonResponse(array('message' => 'Invalid token.'), 403); } $uploadDir = $this->getParameter('photo_upload_dir'); $filename = $uploadDir . '/' . $album->getId() . '-' . $album->getTitle() . '.zip'; $zip = new \ZipArchive(); if ($zip->open($filename, \ZipArchive::CREATE) !== true) { throw new Exception('Cannot open or create ZIP archive for file ' . $filename); } foreach ($album->getPhotos() as $photo) { if ($zip->locateName($photo->getFilename()) === false) { $zip->addFile($uploadDir . '/' . $photo->getFilename(), $photo->getFilename()); } } $zip->close(); $response = new BinaryFileResponse($filename); $response->headers->set('Content-disposition', 'attachment;filename="' . $album->getTitle() . '.zip"'); return $response; }
/** * @param Album $album * @return Query */ public function getPaginationQuery(Album $album) { return $this->createQueryBuilder('Image')->select('Image')->where('Image.albumId = :albumId')->setParameter('albumId', $album->getId())->getQuery(); }