2

我正在使用 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 中。

非常感谢您的帮助。

4

2 回答 2

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
于 2016-05-31T14:55:17.957 回答
0

我使用 LiipImagineBundle 提供的服务来更好地控制过滤过程。换句话说,我没有liip_imagine.controller在控制器内部获取服务,而是使用了“底层”服务liip_imagine.data.manager:liip_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内置过滤器的配置。感谢您的时间。我希望我能收到有关这种方法的反馈。

于 2016-06-02T17:01:26.687 回答