2016-05-31 2 views
1

LiipImagineBundle을 사용하여 업로드 된 이미지에서 필터링 된 이미지를 만듭니다. 번들의 현재 설정은 다음과 같습니다 원래 크기원본 폴더와 필터링 된 이미지를 같은 폴더에 저장하십시오. - LiipImagineBundle

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

작은 이미지

유형은 다음 중 하나입니다 s 또는 o :

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에 표시됩니다.

귀하의 도움에 감사드립니다.

답변

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); 

에 현재 저장되어,이 구성의 변화를 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 함수를 적용한 다음 새로운 File을 저장할 수 있습니다. 하지만 일이 끝나면 갈 수 있습니다. :) – Terenoth

1

사용자 정의 CacheResolver (Liip\ImagineBundle\Imagine\Cache\Resolver\ResolverInterface 구현)을 생성해야합니다. 처음에는 쉬운 일이 아니지만 그러한 특별한 사용 사례를 갖는 유일한 방법입니다.

그런 다음, 태그 liip_imagine.cache.resolver과 서비스로 사용자 정의 CacheResolver를 등록, 당신의 선택 (예 : <tag name="liip_imagine.cache.resolver" resolver="same_folder" />을)의 이름을 태그에게 resolver 속성을 제공하고 config.yml이 해결 프로그램을 사용

liip_imagine: 
    filter_sets: 
     FILTER_NAME: 
      cache: same_folder 
+0

나는 이것을 구현하려고 시도했지만, 나는 대답으로 준 또 다른 접근법을 따랐다. 모든 의견은 높이 평가됩니다. –

관련 문제