* album export

This commit is contained in:
Danyi Dávid 2017-08-15 00:32:07 +02:00
parent 71253ff1ac
commit 5b04f5e222
7 changed files with 67 additions and 8 deletions

View File

@ -29,3 +29,4 @@
$app->get('/', App\Action\HomePageAction::class, 'home');
$app->get('/api/galleries', App\Action\ListGalleriesAction::class, 'api.galleries');
$app->get('/image/{slug}/{image}[/{thumb}]', App\Action\GetImageAction::class, 'download.image');
$app->get('/export-album/{slug}', App\Action\ExportAlbumAction::class, 'export.album');

View File

@ -8,8 +8,9 @@ set('ssh_multiplexing', true);
set('repository', 'https://gogs.ragnarok.yvan.hu/yvan/gallery-api.git');
set('shared_dirs', [
// 'vendor',
'data/export',
'data/galleries',
'data/tmp',
]);
set('shared_files', [
'config/autoload/doctrine.local.php',

1
public/export Symbolic link
View File

@ -0,0 +1 @@
../data/export

View File

@ -0,0 +1,27 @@
<?php
namespace App\Action;
use App\Service\GalleryService;
use Interop\Http\ServerMiddleware\DelegateInterface;
use Interop\Http\ServerMiddleware\MiddlewareInterface as ServerMiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Zend\Diactoros\Response;
class ExportAlbumAction implements ServerMiddlewareInterface
{
private $galleryService;
public function __construct(GalleryService $galleryService)
{
$this->galleryService = $galleryService;
}
public function process(ServerRequestInterface $request, DelegateInterface $delegate)
{
$slug = $request->getAttribute('slug', false);
$this->galleryService->getExportFileName($slug);
return new Response\RedirectResponse("/export/{$slug}.zip");
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Action;
use App\Service\GalleryService;
use Interop\Container\ContainerInterface;
class ExportAlbumFactory
{
public function __invoke(ContainerInterface $container)
{
$galleryService = $container->get(GalleryService::class);
return new ExportAlbumAction($galleryService);
}
}

View File

@ -44,6 +44,7 @@ class ConfigProvider
Action\ListGalleriesAction::class => Action\ListGalleriesFactory::class,
Action\GetImageAction::class => Action\GetImageFactory::class,
Action\ExportAlbumAction::class => Action\ExportAlbumFactory::class,
Service\GalleryService::class => Service\GalleryServiceFactory::class,
],

View File

@ -3,7 +3,6 @@
namespace App\Service;
use App\Entity\Image;
use Doctrine\ORM\EntityManager;
use Imagine\Gd\Imagine;
@ -17,6 +16,7 @@ class GalleryService
const CONFIG_FILE = 'data/galleries/config.yaml';
const IMAGE_BASEDIR = 'data/galleries/%s/';
const EXPORT_DIR = 'data/export/';
const THUMBNAIL_SIZE = 500;
protected $contentTypeMap = [
@ -36,25 +36,38 @@ class GalleryService
$this->em = $entityManager;
}
public function exportGallery(string $slug)
public function getExportFileName(string $slug)
{
$config = $this->getConfig();
if (!isset($config['galleries'][$slug])) {
return false;
}
$dir = $config['galleries'][$slug]['dir'];
$images = array_map('basename', glob(sprintf(self::IMAGE_BASEDIR . "*.{jpg,jpeg,png}", $dir), GLOB_BRACE));
return $this->ensureExportFileExists($dir, "{$slug}.zip");
}
private function ensureExportFileExists(string $dir, string $filename)
{
$exportName = self::EXPORT_DIR . $filename;
if(file_exists($exportName)) {
return $exportName;
}
$images = array_map('basename', glob($this->getImageDir($dir) . "*.{jpg,jpeg,png}", GLOB_BRACE));
$zipName = tempnam("data/tmp", "export");
$zipArchive = new \ZipArchive();
$zipArchive->open($zipName, \ZipArchive::CREATE);
foreach ($images as $image) {
$zipArchive->addFile("{$dir}/{$image}");
ini_set("max_execution_time", 60);
$zipArchive->addFile(
sprintf(self::IMAGE_BASEDIR,$dir) . $image,
"{$dir}/{$image}"
);
}
$zipArchive->close();
return $zipName;
rename($zipName, $exportName);
return $exportName;
}
public function loadGalleryData($includeHidden = false)