Add Glide lib to handle image filters

Using flysystem and resources.
pull/3016/head
Julio Montoya 5 years ago
parent 0fa33a83c8
commit 1ea1ba373a
  1. 3
      composer.json
  2. 8
      config/packages/oneup_flysystem.yaml
  3. 59
      config/services.yaml
  4. 51
      src/CoreBundle/Component/Utils/Glide.php
  5. 66
      src/CoreBundle/Controller/ResourceController.php
  6. 24
      src/CoreBundle/Repository/ResourceRepository.php

@ -164,7 +164,8 @@
"league/csv": "^9.1",
"brumann/polyfill-unserialize": "^1.0",
"vich/uploader-bundle": "1.8.*",
"maennchen/zipstream-php": "^1.2"
"maennchen/zipstream-php": "^1.2",
"league/glide-symfony": "^1.0"
},
"config": {
"component-dir": "public/assets"

@ -3,9 +3,15 @@ oneup_flysystem:
resource_adapter:
local:
directory: '%kernel.project_dir%/var/upload/resource'
resource_cache_adapter:
local:
directory: '%kernel.project_dir%/var/cache/resource'
filesystems:
resources:
adapter: resource_adapter
mount: resources_fs
visibility: private
cache_resources:
adapter: resource_cache_adapter
mount: cache_resources_fs
visibility: private

@ -1,3 +1,35 @@
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
password_encryption: '%env(APP_ENCRYPT_METHOD)%'
secret: '%env(APP_SECRET)%'
locale: '%env(APP_LOCALE)%'
url_append: '%env(APP_URL_APPEND)%'
installed: '%env(APP_INSTALLED)%'
twig:
form:
resources:
- 'GeneratorBundle::fields.html.twig'
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: admin@example.com
mailer_password: null
course_info_is_not_editable: false
sonata_media.cdn.host: '%url_append%/public/resource'
sonata_page.varnish.command: 'if [ ! -r "/etc/varnish/secret" ]; then echo "VALID ERROR :/"; else varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 {{ COMMAND }} "{{ EXPRESSION }}"; fi;'
router.request_context.base_url: '%url_append%'
asset.request_context.base_path: '%url_append%'
glide_config:
source: 'oneup_flysystem.resources_filesystem'
cache: 'oneup_flysystem.cache_resources_filesystem'
glide_media_filters:
document_thumbnail_small:
w: 100
h: 100
services:
# default configuration for services in *this* file
_defaults:
@ -9,6 +41,11 @@ services:
bind:
$passwordEncrypt: '%password_encryption%'
Chamilo\CoreBundle\Component\Utils\Glide:
arguments:
- {source: '@oneup_flysystem.resources_filesystem', cache: '@oneup_flysystem.cache_resources_filesystem'}
- '%glide_media_filters%'
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
_instanceof:
@ -140,25 +177,3 @@ imports:
# - "%kernel.root_dir%/../doclib/uploads"
# - true
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
password_encryption: '%env(APP_ENCRYPT_METHOD)%'
secret: '%env(APP_SECRET)%'
locale: '%env(APP_LOCALE)%'
url_append: '%env(APP_URL_APPEND)%'
installed: '%env(APP_INSTALLED)%'
twig:
form:
resources:
- 'GeneratorBundle::fields.html.twig'
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: admin@example.com
mailer_password: null
course_info_is_not_editable: false
sonata_media.cdn.host: '%url_append%/public/resource'
sonata_page.varnish.command: 'if [ ! -r "/etc/varnish/secret" ]; then echo "VALID ERROR :/"; else varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 {{ COMMAND }} "{{ EXPRESSION }}"; fi;'
router.request_context.base_url: '%url_append%'
asset.request_context.base_path: '%url_append%'

@ -0,0 +1,51 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Component\Utils;
use League\Glide\Responses\SymfonyResponseFactory;
use League\Glide\Server;
use League\Glide\ServerFactory;
/**
* Class Glide.
*/
class Glide
{
protected $server;
protected $filters;
/**
* Glide constructor.
*
* @param array $config
* @param array $filters
*/
public function __construct(array $config, array $filters)
{
$this->server = ServerFactory::create(
[
'response' => new SymfonyResponseFactory(),
'source' => $config['source'],
'cache' => $config['cache'],
]
);
$this->filters = $filters;
}
/**
* @return Server
*/
public function getServer(): Server
{
return $this->server;
}
/**
* @return array
*/
public function getFilters(): array
{
return $this->filters;
}
}

@ -9,6 +9,7 @@ use APY\DataGridBundle\Grid\Export\CSVExport;
use APY\DataGridBundle\Grid\Export\ExcelExport;
use APY\DataGridBundle\Grid\Grid;
use APY\DataGridBundle\Grid\Source\Entity;
use Chamilo\CoreBundle\Component\Utils\Glide;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Entity\Resource\ResourceRight;
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
@ -17,8 +18,6 @@ use Chamilo\CourseBundle\Controller\CourseControllerTrait;
use Chamilo\CourseBundle\Entity\CDocument;
use Chamilo\CourseBundle\Repository\CDocumentRepository;
use FOS\RestBundle\View\View;
use League\Flysystem\MountManager;
use Liip\ImagineBundle\Service\FilterService;
use Sonata\MediaBundle\Provider\ImageProvider;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Sylius\Component\Resource\Exception\UpdateHandlingException;
@ -35,8 +34,6 @@ use Vich\UploaderBundle\Util\Transliterator;
* Class ResourceController.
*
* @author Julio Montoya <gugli100@gmail.com>.
*
* @package Chamilo\CoreBundle\Controller
*/
class ResourceController extends BaseController implements CourseControllerInterface
{
@ -404,23 +401,19 @@ class ResourceController extends BaseController implements CourseControllerInter
*
* @param Request $request
* @param CDocumentRepository $documentRepo
* @param FilterService $filterService
*
* @return Response
*/
public function showAction(
Request $request,
CDocumentRepository $documentRepo,
FilterService $filterService,
MountManager $mountManager
Glide $glide
): Response {
$file = $request->get('file');
$type = $request->get('type');
$filter = $request->get('filter'); // see list of filters in config/packages/liip_imagine.yaml
if (empty($type)) {
$type = 'show';
}
// see list of filters in config/packages/liip_imagine.yaml
$filter = $request->get('filter');
$type = !empty($type) ? $type : 'show';
$criteria = [
'path' => "/$file",
@ -448,18 +441,11 @@ class ResourceController extends BaseController implements CourseControllerInter
throw new NotFoundHttpException();
}
//$media = $resourceFile->getMedia();
//$format = MediaProviderInterface::FORMAT_REFERENCE;
$fileName = $resourceNode->getName();
$filePath = $resourceFile->getFile()->getPathname();
$mimeType = $resourceFile->getMimeType();
// @todo use $documentRepo
$fs = $this->get('oneup_flysystem.mount_manager')->getFilesystem('resources_fs');
$stream = $fs->readStream($filePath);
$response = new StreamedResponse(function () use ($stream): void {
stream_copy_to_stream($stream, fopen('php://output', 'wb'));
});
//ServerFactory
switch ($type) {
case 'download':
@ -470,41 +456,21 @@ class ResourceController extends BaseController implements CourseControllerInter
case 'show':
default:
$forceDownload = false;
// $resourceFile = $fs->readStream($resourceFile->getFile()->getPathname());
//var_dump($resourceFile->getFile()->getPathname());
//var_dump($fs->read($resourceFile->getFile()->getPathname()));
// $downloadHandler doesn't work with flysystem:
// https://github.com/dustin10/VichUploaderBundle/issues/827
//return $downloadHandler->downloadObject($resourceFile, 'file', ResourceFile::class, $name);
/** @var ImageProvider $provider */
/* $provider = $this->get('sonata.media.pool')->getProvider($media->getProviderName());
$filename = sprintf(
'%s/%s',
$provider->getFilesystem()->getAdapter()->getDirectory(),
$provider->generatePrivateUrl($media, $format)
);
// See filter definition
if (!empty($filter)) {
$resourcePath = $filterService->getUrlOfFilteredImage(
$provider->generatePrivateUrl($media, $format),
$filter
);
if ($resourcePath) {
$cacheFolder = '/var/cache/resource/';
$pos = strpos($resourcePath, $cacheFolder);
$cacheValue = substr($resourcePath, $pos + strlen($cacheFolder), strlen($resourcePath));
$cachedFile = $this->get('kernel')->getResourceCacheDir().$cacheValue;
if (is_file($cachedFile)) {
$filename = $cachedFile;
}
}
$server = $glide->getServer();
$filter = $glide->getFilters()[$filter] ?? [];
return $server->getImageResponse($filePath, $filter);
}
return new BinaryFileResponse($filename);*/
break;
}
$fs = $documentRepo->getFileSystem();
$stream = $fs->readStream($filePath);
$response = new StreamedResponse(function () use ($stream): void {
stream_copy_to_stream($stream, fopen('php://output', 'wb'));
});
$disposition = $response->headers->makeDisposition(
$forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
Transliterator::transliterate($fileName)

@ -61,6 +61,22 @@ class ResourceRepository extends EntityRepository
$this->entityManager = $entityManager;
}
/**
* @return FilesystemInterface
*/
public function getFileSystem()
{
return $this->fs;
}
/**
* @return EntityManager
*/
public function getEntityManager(): EntityManager
{
return $this->entityManager;
}
/**
* @return EntityRepository
*/
@ -92,13 +108,7 @@ class ResourceRepository extends EntityRepository
return $this->getRepository()->findOneBy($criteria, $orderBy);
}
/**
* @return EntityManager
*/
public function getEntityManager(): EntityManager
{
return $this->entityManager;
}
/**
* Creates a ResourceNode.

Loading…
Cancel
Save