Symfony 2.1 でLiipImagineBundleを使用しており、アップロード時にユーザーがアップロードした画像のサイズを変更してから、永続的なファイルシステムの場所に保存したいと考えています (メタデータを削除し、jpeg 形式を強制し、ファイルのサイズを制限するため)。コントローラーから「ストリップ」および「サイズ変更」フィルターを呼び出し、フィルター処理された画像を一時的な場所からファイルシステムで選択したフォルダーに保存する必要があります。
バンドルの readme に示されているように、LiipImageBundle Controller をサービスとして使用しようとしましたただし、呼び出されたアクションは主に、画像を表示する要求が行われたときにキャッシュ ディレクトリにフィルター処理された画像を作成するためのものです (アップロード中のフィルター処理に使用することは別のケースです)。とにかく次のように実装しようとしましたが、うまくいきました。フィルタを適用できるようにするには、最初にファイルを Web サーバーの php 一時ディレクトリから Web フォルダ内のディレクトリに移動する必要がありました。次に、フィルターを適用し、フィルター処理されていない最初のファイルを削除 (unlink()) しました。最後に、フィルター処理されたファイルをファイル システム内の永続的な場所に移動 (rename()) する必要がありました。すべてを機能させるには、ファイルを 2 回移動し、フィルターを 1 回適用し、1 つのファイルを削除 (リンク解除) する必要がありました。アップロード時にバンドルを使用するためのより良い方法 (中間移動を必要としない) はありますか?
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);
}
}
app/config/config.yml のフィルターは次のとおりです。
liip_imagine:
filter_sets:
my_filter:
format: jpeg
filters:
strip: ~
thumbnail: { size: [1600, 1000], mode: inset }
ImagineAvalancheBundle についても同様の質問がありましたが、詳細は不明です。おそらく、ここで提供されているリストから別のサービスを実装することは、より良い解決策でしょうか?