<?php
namespace App\Controller\Api;
use App\Entity\MultiDownloadItem;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Wamania\ZipStreamedResponseBundle\Response\ZipStreamedResponse;
use Wamania\ZipStreamedResponseBundle\Response\ZipStreamer\ZipStreamer;
class MultiDownloadItemApiController extends AbstractController
{
/**
* @Route("/api/multidownload/item", name="gcs_api_multidownload_item", methods={"GET"})
*/
public function getUrlAction(Request $request)
{
$multiDownloadItems = $request->get('files');
if (!$multiDownloadItems) {
return new Response('No id provided');
}
$items = $this->getDoctrine()->getRepository(MultiDownloadItem::class)->findByIds($multiDownloadItems);
if ($items) {
/** @var ZipStreamer $zip */
$zip = $this->iterateItems($items);
return new ZipStreamedResponse($zip);
}
return new Response('Wrong ids');
}
private function iterateItems($items)
{
$name = date('mdY') .'_'. $this->generateRandomString();
$zipStreamer = new ZipStreamer($name.'.zip');
/** @var MultiDownloadItem $item */
foreach ($items as $item) {
$zipStreamer->add(
$this->getParameter('kernel.project_dir').'/public'.$item->getMedia()->getUrl(),
$name .'_'. $item->getMedia()->getOriginalFilename()
);
}
return $zipStreamer;
}
function generateRandomString($length = 10)
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
}