2016-05-31 10 views
1

Ich benutze LiipImagineBundle, um ein gefiltertes Bild von einem hochgeladenen Bild zu erstellen. Die aktuelle Konfiguration des Bündels ist:Original und gefiltertes Bild im selben Ordner speichern - LiipImagineBundle

liip_imagine: 
    resolvers: 
     default: 
      web_path: ~ 

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

Mein Ziel ist es, eine Verzeichnisstruktur wie zu erstellen:

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

Der Typ ist entweder s für kleines Bild oder o für Originalgröße. Das Unterverzeichnis wird ab dem Uploaddatum erstellt.

Das Problem ist, dass LiipImagineBundle die gefilterten Bilder in web_root\my_filter\{subdirecory}\{type}_{filename_md5_hash}.jpeg speichert.

Wie kann ich den my_filter Teil der URL weglassen? Ich brauche jedes hochgeladene Bild und dessen Filterung, um im selben endgültigen Ordner gespeichert zu werden.

Ich bin kein Experte und ich habe eine Menge Forschung vergebens. Die Konfiguration erlaubt es, den Web-Pfad des Caches entweder für die gesamten Filter oder für einzelne Filter zu ändern, aber der Filtername erscheint immer in der letzten URL.

Ihre Hilfe wird sehr geschätzt.

Antwort

0

Ich benutzte die mit LiipImagineBundle bereitgestellten Dienste, um mehr Kontrolle über den Filterprozess zu haben. Mit anderen Worten, anstatt liip_imagine.controller Service innerhalb des Controllers zu erhalten, verwendete ich die "zugrunde liegenden" Dienste: liip_imagine.data.manager, liip_imagine.filter.manager und liip_imagine.cache.manager.

In meiner speziellen Situation habe ich auch die Verwendung von liip_imagine.cache.manager weggelassen, weil ich schließlich beschlossen, die gefilterten Bilder im selben Verzeichnis wie die Originalbilder zu speichern. Somit ist der Cache nicht involviert (weder in der Konfiguration noch in der Direktruktur). So wird alles gespeichert jetzt in 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); 

Natürlich ist diese invloves eine Änderung der Konfiguration:

my_filter: 
     filters: 
      relative_resize: [] 

In der Tat kann ich jetzt verwenden, um dynamisch eine beliebige Konfiguration von relative_resize eingebauten Filter. Vielen Dank für Ihre Zeit. und ich hoffe, dass ich Feedback zu diesem Ansatz bekomme.

+0

Da Sie mit dieser Lösung überhaupt keinen Cache verwenden, können auf lange Sicht Leistungsprobleme auftreten. Und ich sehe nicht, warum Sie die Datei in Ihrem Unterverzeichnis speichern, da Sie die gefilterte Datei immer zur Laufzeit erzeugen und niemals die gecachte Datei verwenden. Aber abgesehen davon stimme ich zu, dass das funktioniert. Das ist weniger optimal und sauber als das, was ich vorgeschlagen habe, aber es macht den Job. – Terenoth

+0

@Terenoth, danke für Ihre Zeit, Sir. Ich verstehe nicht, warum "ich auf lange Sicht Leistungsprobleme habe". Ich erzeuge keine gefilterte Datei zur Laufzeit. Was ich mache, ist ein gefiltertes Bild während des Hochladens der Datei (innerhalb von uploadAction im Controller). Ich "cache" es dann in einem anderen Ordner als den Standardordner von liipImagineBundle. Ihre Erklärungen werden sehr geschätzt. –

+0

Oh, ich dachte, dein Code wäre eine Display-Aktion, keine Upload-Aktion, mein Fehler. In diesem Fall keine Leistungsprobleme. Ich denke, das einzige Argument, das man machen kann, ist, dass man LiipImagineBundle eigentlich nicht braucht, sondern nur sich selbst vorstellt, da man die Cache- und Filterfunktionen von LiipImagine nicht wirklich nutzt. Sie könnten einfach die hochgeladene Binärdatei erhalten, Imagine-Funktionen darauf anwenden und dann Ihre neue Datei speichern, ohne auch nur 'liip_imagine.data.manager' und' liip_imagine.filter.manager' aufzurufen. Aber solange die Dinge funktionieren, ist es gut zu gehen :) – Terenoth

1

Was Sie wollen, müssen Sie eine benutzerdefinierte CacheResolver erstellen (Implementierung Liip\ImagineBundle\Imagine\Cache\Resolver\ResolverInterface). Es ist zunächst keine leichte Aufgabe, aber es ist der einzige Weg, einen solchen speziellen Anwendungsfall zu haben.

Dann Ihre benutzerdefiniertes registrieren CacheResolver als Dienst mit dem Tag liip_imagine.cache.resolver, geben Sie Ihren Tag ein resolver Attribut mit dem Namen Ihrer Wahl (zB <tag name="liip_imagine.cache.resolver" resolver="same_folder" />), und verwenden Sie diesen Resolver in Ihrem config.yml

liip_imagine: 
    filter_sets: 
     FILTER_NAME: 
      cache: same_folder 
+0

Ich versuchte dies zu implementieren, aber während ich das tat, folgte ich einem anderen Ansatz, den ich als Antwort gab. Alle Anmerkungen werden sehr geschätzt. –