Utilisation LiipImagineBundle de Redimensionnement de l'Image après l'Upload?
Je suis en utilisant le LiipImagineBundle avec Symfony 2.1 et souhaitez redimensionner utilisateur de télécharger des images à télécharger avant de les enregistrer sur la localisation du système de fichiers (pour la bande de métadonnées, imposer format jpeg, et de limiter la taille du fichier). J'ai appeler une 'bande' et 'redimensionner' filtre de la manette, puis enregistrer l'image filtrée à partir d'un emplacement temporaire dans un dossier de mon choix dans le système de fichiers.
J'ai essayé d'utiliser le LiipImageBundle Contrôleur comme un service, comme indiqué dans le bundle du readme mais l'Action demandée est principalement pour la création d'une image filtrée dans le répertoire de cache quand une demande est faite à l'affichage de l'image (de l'utiliser pour le filtrage pendant le téléchargement est une autre affaire). J'ai essayé de la mettre en œuvre comme suit, de toute façon, et il a obtenu de travailler. J'ai dû d'abord déplacer le fichier à partir du serveur web php du répertoire temporaire vers un répertoire dans le dossier web pour être en mesure d'appliquer le filtre. Ensuite, j'ai appliqué le filtre et supprimés (unlink()) la première non filtrée fichier. Enfin, j'ai dû déplacer (rename()) le fichier filtré à l'emplacement permanent dans le système de fichiers. Il était nécessaire de déplacer le fichier deux fois, appliquer le filtre une fois, et de supprimer (unlink) 1 fichier pour les faire fonctionner. Est-il une meilleure façon de (ne nécessitant pas le mouvement intermédiaire) pour utiliser le bundle à télécharger?
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);
}
}
Mon filtre dans le dossier app/config/config.yml comme suit:
liip_imagine:
filter_sets:
my_filter:
format: jpeg
filters:
strip: ~
thumbnail: { size: [1600, 1000], mode: inset }
Une question similaire a été posée pour la ImagineAvalancheBundle mais pas beaucoup de détails sont donnés. Peut-être la mise en œuvre de un autre service à partir de la liste fournie ici est une meilleure solution?
Je n'ai pas trouvé d'autre solution, mais celui décrit ci-dessus semble fonctionner correctement (je l'ai gardé de cette façon).
Je suis en train de travailler sur une solution et poster ici quand il fonctionne.
OriginalL'auteur RayOnAir | 2013-02-24
Vous devez vous connecter pour publier un commentaire.
Voici donc un moyen de créer des vignettes à télécharger avec LiipImagineBundle. L'astuce consiste à utiliser certains de leurs autres services:
Cela pourrait aussi être fait en appelant directement l'Imaginer fonctions de la bibliothèque si vous n'avait pas d'autre raison d'inclure la LiipImagineBundle. Je vais probablement regarder dans l'avenir, mais cela fonctionne pour mon cas et fonctionne très bien.
+1: Vous avez identifié les services pour appliquer le filtre et enregistrer l'image transformée à la destination souhaitée. La réponse complète à ma question est une combinaison de mes étapes pour enregistrer une image temporaire du système de fichiers et à vos mesures pour appliquer le filtre et enregistrer l'image en fonction de la destination finale (comme ma question est pour appliquer le filtre directement sur le téléchargement de l'image pour la redimensionner avant de les enregistrer dans le système de fichiers). Votre solution pour la création de vignettes et de les stocker à partir d'une image qui est déjà dans le système de fichiers.
Remarquez qu'il ne semble pas possible d'appliquer un filtre à une image qui n'est pas déjà dans un dossier quelque part dans le répertoire web, sauf les privilèges d'accès sont définies.
Je n'ai pas essayé d'appliquer un filtre à un ruisseau qui n'a pas été enregistré quelque part. Je ne sais pas si c'est possible. Si vous comprendre comment s'il vous plaît ajouter un commentaire à cette réponse.
Méthode non
get
surLiip\ImagineBundle\Filter\FilterManager
. Au lieu de cela,$filterManager->applyFilter($image, $filter);
devrait être utilisé comme @Imran réponse.OriginalL'auteur Peter Wooster
Version modifiée de @Peter Wooster, et fait plus générique, donc si quelqu'un est de l'utiliser sans l'Image de l'entité qu'il/elle peut facilement prendre benifet. Je donne ici deux versions, l'une qui peut être utilisé conservés dans de l'utilitaire ou de la non-contrôleur de classe. Et l'autre version est pour les classes de contrôleur. C'est à vous maintenant où vous le souhaitez 🙂
Pour utilisation à l'extérieur du contrôleur par exemple, en le gardant dans les classes utilitaires
À utiliser dans le contrôleur par exemple CommonController ou tout autre contrôleur.
essayez de télécharger d'autres images et avec un autre type, comme l'image type mime semble endommagé ou ayant d'autres problèmes.
OriginalL'auteur Imran Zahoor
Étant donné que je n'ai pas trouvé une meilleure façon, j'ai gardé la solution décrite dans la question de la description. Cette solution ne semble pas optimal à partir d'une performance point (il faut déplacer le fichier deux fois, appliquer le filtre une fois, et de dissocier 1 fichier), mais il fait le travail accompli.
Mise à JOUR:
J'ai changé mon code pour utiliser les services indiqués dans la Pierre Wooster réponse, comme indiqué ci-dessous (cette solution est plus optimale que l'image filtrée est enregistré directement à la destination finale):
OriginalL'auteur RayOnAir
J'ai écrit un module qui résout exacte de ce problème. Alors que
VichUploaderBundle
facilite le téléchargement en utilisant l'ORM du Cycle de vie des rappels,LiipImagine
fait un excellent travail au redimensionnement.Ici est la combinaison de l'informatique: https://github.com/RSSfeed/VichImagineBundle
Voir le court readme sur la façon de mettre en œuvre en seulement quelques minutes.
OriginalL'auteur Dennis
Au lieu de charger le fichier à l'aide de liip gestionnaire de données, créer liip objet binaire à partir du fichier téléchargé:
alors utiliser le code suivant:
OriginalL'auteur Kinan