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