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

Store both original and filtered image under the same folder - 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

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

我不是专家,我做了很多研究都无济于事。该配置允许为整个过滤器或单个过滤器更改缓存的 Web 路径,但过滤器名称始终出现在最终 url.

非常感谢您的帮助。

您想要什么需要您创建自定义 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

我使用 LiipImagineBundle 提供的服务来更好地控制过滤过程。换句话说,我没有在控制器中获取 liip_imagine.controller 服务,而是使用了 "underlying" 服务: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 内置过滤器的任何配置。 感谢您的时间。我希望我能收到有关此方法的反馈。