首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将原始图像和过滤图像存储在同一个文件夹下- LiipImagineBundle

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

Stack Overflow用户
提问于 2016-05-31 14:07:51
回答 2查看 1.1K关注 0票数 2

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

代码语言:javascript
代码运行次数:0
运行
复制
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中。

非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-02 17:01:26

我使用LiipImagineBundle提供的服务来更好地控制过滤过程。换句话说,我没有在控制器中使用liip_imagine.controller服务,而是使用了“基础”服务:liip_imagine.data.managerliip_imagine.filter.managerliip_imagine.cache.manager

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

代码语言:javascript
代码运行次数:0
运行
复制
    $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);

当然,这会使配置发生变化:

代码语言:javascript
代码运行次数:0
运行
复制
    my_filter:
        filters:
            relative_resize: [] 

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

票数 0
EN

Stack Overflow用户

发布于 2016-05-31 14:55:17

您想要的东西要求您创建一个自定义CacheResolver (实现Liip\ImagineBundle\Imagine\Cache\Resolver\ResolverInterface)。起初,这不是一个容易的任务,但这是拥有这样一个特定用例的唯一方法。

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

代码语言:javascript
代码运行次数:0
运行
复制
liip_imagine:
    filter_sets:
        FILTER_NAME:
            cache: same_folder
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37548048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档