2016-05-31 6 views
1

LiipImagineBundleを使用して、アップロードした画像からフィルタリングされた画像を作成しています。バンドルの現在の構成は次のとおりです。元のサイズのため元の画像とフィルタリングされた画像を同じフォルダに保存します。 - LiipImagineBundle

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

小さな画像について

タイプはどちらかso

liip_imagine: 
    resolvers: 
     default: 
      web_path: ~ 

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

私の目標は次のようなディレクトリ構造を作成することです。サブディレクトリはアップロード日から作成されます。

LiipImagineBundleは、フィルタリングされた画像をweb_root\my_filter\{subdirecory}\{type}_{filename_md5_hash}.jpegに保存するという問題があります。

my_filterのURLの部分はどうやって省略できますか?アップロードされた各画像とフィルタリングされた画像が同じ最終フォルダに保存される必要があります。

私は専門家ではなく、私は役に立たないように多くの研究を行いました。この設定では、フィルタ全体または個々のフィルタのキャッシュのWebパスを変更することができますが、最終的なURLには常にフィルタ名が表示されます。

お手数をおかけします。

答えて

0
このリゾルバを使用

私はLiipImagineBundleで提供されているサービスを使用して、フィルタリングプロセスをより詳細に制御しました。つまり、liip_imagine.controllerサービスをコントローラー内で使用する代わりに、「基礎」サービスを使用しました:liip_imagine.data.managerliip_imagine.filter.managerおよびliip_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); 

に今格納され、これは構成の変更をinvloves:

my_filter: 
     filters: 
      relative_resize: [] 

実際に、私は今、動的のいずれかの構成を使用することができますrelative_resizeビルトインフィルタ。 ありがとうございます。私はこのアプローチに関するフィードバックを受け取ることを願っています。

+0

このソリューションではキャッシュをまったく使用しないため、長期的にはパフォーマンスの問題が発生する可能性があります。また、実行時に常にフィルタリングされたファイルを生成し、キャッシュされたファイルを使用しないため、サブディレクトリにファイルを保存する理由はわかりません。しかしそれに加えて、私はこれがうまくいくことに同意します。これは私が提案したものよりも最適ではなくクリーンですが、それは仕事です。 – Terenoth

+0

@テレノス、ありがとうございました。私は正直なところ、「なぜ長期的にはパフォーマンスの問題があるのか​​」を理解していません。私は実行時にフィルタリングされたファイルを生成しません。私がやっているのは、ファイルをアップロードしている間にフィルタリングされた画像を作成することです(コントローラのuploadAction内にあります)。 liipImagineBundleのデフォルトフォルダとは別のフォルダに 'キャッシュ 'します。あなたの説明は非常に高く評価されています。 –

+0

あなたのコードは表示アクションであり、アップロードアクションではないと思いました。その場合、実際にはパフォーマンスの問題はありません。私はLiipImagineBundleを実際には必要としないが、LiipImagineのキャッシュとフィルタ機能を実際に使用していないので、自分自身を想像してみてください。あなたは 'liip_imagine.data.manager'と' liip_imagine.filter.manager'を呼び出すことなく、アップロードされたバイナリを取得し、Imagine関数を適用して新しいファイルを保存することができます。しかし、物事が働く限り、あなたは行くのが良いです:) – Terenoth

1

CacheResolverLiip\ImagineBundle\Imagine\Cache\Resolver\ResolverInterfaceを実装する)をカスタム作成する必要があります。最初は簡単な作業ではありませんが、そのような特定の使用事例を持つ唯一の方法です。その後

、タグliip_imagine.cache.resolverとサービスとしてカスタムCacheResolverを登録し、あなたのタグお好みの名前でresolver属性(例えば<tag name="liip_imagine.cache.resolver" resolver="same_folder" />)を得、そしてあなたのconfig.ymlに

liip_imagine: 
    filter_sets: 
     FILTER_NAME: 
      cache: same_folder 
+0

私はこれを実装しようとしましたが、私は答えとして与えた別のアプローチに従っていました。どんな発言も大変感謝しています。 –

関連する問題