Ich benutze die LiipImagineBundle mit Symfony 2.1 und möchte die Größe der vom Benutzer hochgeladenen Bilder beim Hochladen ändern, bevor sie in den permanenten Dateisystemspeicherort gespeichert werden (um Metadaten zu entfernen, JPEG-Format zu erzwingen und die Größe der Datei zu begrenzen). Ich muss einen 'strip' und 'resize' Filter vom Controller aufrufen und dann das gefilterte Bild von einem temporären Speicherort in einen Ordner meiner Wahl im Dateisystem speichern.Verwenden Sie LiipImagineBundle, um das Bild nach dem Hochladen zu skalieren?
Ich habe versucht, die LiipImageBundle Controller as a service as indicated in the bundle's readme zu verwenden, aber die aufgerufene Aktion dient hauptsächlich zum Erstellen eines gefilterten Bildes im Cache-Verzeichnis, wenn eine Anfrage zur Anzeige des Bildes gemacht wird (die Verwendung für die Filterung beim Hochladen ist ein weiterer Fall). Ich habe versucht, es wie folgt zu implementieren und es zum Laufen gebracht. Ich musste zuerst die Datei aus dem temporären PHP-Verzeichnis des Webservers in ein Verzeichnis im Webordner verschieben, um den Filter anwenden zu können. Zweitens habe ich den Filter angewendet und die ursprüngliche ungefilterte Datei gelöscht (unlink()). Zuletzt musste ich die gefilterte Datei an die permanente Stelle im Dateisystem verschieben (umbenennen). Es war notwendig, die Datei zweimal zu verschieben, den Filter einmal anzuwenden und 1 Datei zu löschen (aufheben), um alles zu funktionieren. Gibt es einen besseren Weg (ohne den Zwischenzug), das Bundle beim Upload zu verwenden?
class MyController extends Controller
{
public function new_imageAction(Request $request)
{
$uploadedFile = $request->files->get('file');
$tmpFolderPathAbs = $this->get('kernel')->getRootDir() . '/../web/uploads/tmp/';
$tmpImageNameNoExt = rand();
$tmpImageName = $tmpImageNameNoExt . '.' . $fileExtension;
$uploadedFile->move($tmpFolderPathAbs, $tmpImageName);
$tmpImagePathRel = '/uploads/tmp/' . $tmpImageName;
// Create the filtered image in a tmp folder:
$this->container->get('liip_imagine.controller')->filterAction($request, $tmpImagePathRel, 'my_filter');
unlink($tmpFolderPathAbs . $tmpImageName);
$filteredImagePathAbs = $this->get('kernel')->getRootDir() . '/../web/uploads/cache/my_filter/uploads/tmp/' . $tmpImageNameNoExt . '.jpeg';
$imagePath = $imageManagerResponse->headers->get('location');
// define permanent location ($permanentImagePathAbs)...
rename($filteredImagePathAbs, $permanentImagePathAbs);
}
}
Mein Filter in der app/config/config.yml ist wie folgt:
liip_imagine:
filter_sets:
my_filter:
format: jpeg
filters:
strip: ~
thumbnail: { size: [1600, 1000], mode: inset }
A similar question was asked for the ImagineAvalancheBundle aber keine viel Details gegeben. Vielleicht ist die Implementierung von another service from the here provided list eine bessere Lösung?
Haben Sie jemals eine bessere Lösung finden? Ich möchte das auch. Der Filter funktioniert gut, aber die Leistung ist nicht gut, wenn ich viele Miniaturansichten habe, die beim Laden vom Cache an einen bekannten Ort verschoben werden, was die Geschwindigkeit dramatisch erhöht. –
@PeterWooster: Ich habe keine andere Lösung gefunden, aber die oben beschriebene scheint gut zu funktionieren (ich behielt es so). – RayOnAir
Ich arbeite an einer Lösung und werde hier posten, wenn es funktioniert. –