将原始图像和已过滤图像存储在同一文件夹下 - LiipImagineBundle

时间:2016-05-31 14:07:51

标签: php symfony liipimaginebundle

我正在使用LiipImagineBundle从上传的图像创建过滤后的图像。捆绑包的当前配置是:

liip_imagine:
    resolvers:
       default:
          web_path: ~

    filter_sets:
        cache: ~
        my_filter:
            filters:
                relative_resize: { heighten: 66 } 

我的目标是创建一个目录结构,如:

web_root\{subdirectory}\{type}_{filename_md5_hash}.jpeg

小图片的类型为s,原始尺寸为o。子目录是从上传日期创建的。

问题在于LiipImagineBundle将过滤后的图像存储在web_root\my_filter\{subdirecory}\{type}_{filename_md5_hash}.jpeg中。

如何省略网址的my_filter部分?我需要将每个上传的图像及其过滤后的图像存储在同一个最终文件夹中。

我不是专家,我做了很多研究但无济于事。配置允许更改整个过滤器或单个过滤器的高速缓存的Web路径,但过滤器名称始终在最终URL中显示。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您想要的是创建自定义CacheResolver(实施Liip\ImagineBundle\Imagine\Cache\Resolver\ResolverInterface)。一开始这不是一件容易的事,但它是拥有这样一个特定用例的唯一方法。

然后,将自定义CacheResolver注册为带有标记liip_imagine.cache.resolver的服务,为您的代码添加一个resolver属性,其中包含您选择的名称(例如<tag name="liip_imagine.cache.resolver" resolver="same_folder" />),并在config.yml中使用此解析器

liip_imagine:
    filter_sets:
        FILTER_NAME:
            cache: same_folder

答案 1 :(得分:0)

我使用LiipImagineBundle提供的服务来更好地控制过滤过程。换句话说,我没有在控制器中获得liip_imagine.controller服务,而是使用了&#34;底层&#34;服务:liip_imagine.data.managerliip_imagine.filter.managerliip_imagine.cache.manager

在我的特殊情况下,我也省略了liip_imagine.cache.manager的使用,因为我最终决定将过滤后的图像存储在与原始图像相同的目录中。因此不涉及缓存(既不是配置也不是直接结构)。所以现在所有内容都存储在web\images

    $small_path= 's_'. $image_file->getClientOriginalName();


    $filter = 'my_filter';
    $config= array( 'widen' => 960) ;

    $path = $image->getWebPath();

    $container = $this->container;                                 
    $dataManager = $container->get('liip_imagine.data.manager');
    $filterManager = $container->get('liip_imagine.filter.manager');

    $binary = $dataManager->find($filter, $path);

    $filteredBinary =  $filterManager->applyFilter( $binary, $filter, array(
                           'filters' => array(
                               'relative_resize' =>  $config
                            )
                        ));

    $small_path = str_replace("subdirectory/","subdirectory/s_",'subdirectory/'.$small_path );
    $s = $sBinary->getContent();                               

    $f = fopen($smallPath, 'w');                                 
    fwrite($f, $s );                                            
    fclose($f);

当然,这会改变配置:

    my_filter:
        filters:
            relative_resize: [] 

事实上,我现在可以动态使用relative_resize内置过滤器的任何配置。 感谢您的时间。我希望收到关于这种方法的反馈意见。