我正在使用带有Symfony 2.1 的LiipImagineBundle,并希望在上传后重新调整用户上传的图像,然后将它们保存到永久文件系统位置(剥离元数据,强制使用jpeg格式,并限制文件大小).我必须从控制器调用'strip'和'resize'过滤器,然后将过滤后的图像从临时位置保存到我在文件系统中选择的文件夹中.
我尝试使用LiipImageBundle控制器作为捆绑软件自述文件中指示的服务,但被调用的Action主要用于在请求显示图像时在缓存目录中创建过滤后的图像(在上传过程中使用它进行过滤是另一种情况) ).无论如何我试着按照以下方式实现它,并让它工作.我必须先将文件从Web服务器的php临时目录移动到web文件夹中的目录才能应用过滤器.其次,我应用了过滤器并删除了(unlink())初始未过滤的文件.最后,我不得不将过滤后的文件(重命名())移动到文件系统中的永久位置.有必要将文件移动两次,应用过滤器一次,并删除(取消链接)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);
}
} …
Run Code Online (Sandbox Code Playgroud) 我正在通过LIIPImagineBundle为Symfony2使用Imagine来创建存储在S3中的图像的缓存版本.
缓存的图像存储在CloudFront提供的支持S3 Web的存储桶中.但是,S3的默认LIIPImagineBundle实现对我来说太慢了(检查S3上的文件是否存在然后创建到缓存文件或解析功能的URL),所以我已经计算出了我自己的工作流程:
只要我不使用cloudfront,这工作正常.问题似乎是cloudfront正在缓存302重定向响应(即使http规范声明它们不应该).因此,如果我使用cloudfront,则客户端将在无限重定向循环中从Web服务器到云端来回发送,并且即使在生成文件之后,对文件的每个后续请求仍会重定向到Web服务器.
如果我直接使用S3而不是cloudfront,则没有问题,这个解决方案是可靠的.
根据亚马逊的文档 S3重定向规则不允许我指定自定义标头(设置缓存控制标头等),我不相信CloudFront允许我控制重定向的缓存(如果它们做得很好)隐).CloudFront的失效选项是如此有限,以至于我认为它们不会起作用(任何时候都只能使3个对象失效)...我可以在第一次重定向(来自Imagine webserver)上将参数传递回cloudfront来修复无穷无尽的重定向(例如image.jpg?1),但是对同一对象的后续请求仍然是302到网络服务器然后301返回到云端,即使它存在.我觉得应该有一个优雅的解决方案来解决这个问题,但它让我望而却步.任何帮助,将不胜感激!!
caching amazon-s3 amazon-web-services amazon-cloudfront liipimaginebundle
我是symfony2的新手.我正在使用liipImagineBundle来管理图像缩略图.我有一个产品实体类,它使用Lifecycle Callbacks来管理产品图像.
Product.php
<?php
namespace Svipl\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as GEDMO;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Svipl\AdminBundle\Entity\Product
* @ORM\Entity
* @ORM\Table(name="product")
* @ORM\Entity(repositoryClass="Svipl\AdminBundle\Entity\ProductRepository")
* @ORM\HasLifecycleCallbacks
*/
class Product{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=25, unique=true)
*/
private $name;
/**
* @ORM\Column(type="text")
*/
private $description;
/**
* @ORM\Column(type="float", length=8)
* @var unknown
*/
private $price;
/**
* @GEDMO\Timestampable(on="update")
* @ORM\Column(name="updated_at", type="datetime")
*/
private $updated_at;
/**
* @GEDMO\Timestampable(on="create")
* @ORM\Column(name="created_at", type="datetime")
*/ …
Run Code Online (Sandbox Code Playgroud) 随着Symfony 2.7中资产组件的引入,如何在没有版本号的情况下输出资产的相对URL?
我使用以下代码whcih不再起作用:
<img src="{{ asset('images/user.png') | imagine_filter('default') }}" alt="Image de profil" class="img-circle whitebg">
Run Code Online (Sandbox Code Playgroud)
资产函数输出一个带有版本号的url,imagi_filter无法正确处理:
http://mywebsite.com/media/cache/resolve/default/images/user.png%3Fversion=v1.0
我的配置:
framework:
assets:
version: 'v1.0'
version_format: '%%s?version=%%s'
base_path: ~
packages:
images:
base_path: /images
version_format: ''
Run Code Online (Sandbox Code Playgroud)
理想情况下,我可以在保持此版本控制策略的同时使想象过滤器工作.否则,停用图像的版本控制可能足够好
谢谢你的帮助 !
在Symfony2的config.yml中,您可以添加"导入",例如:
imports:
- { resource: services.yml }
Run Code Online (Sandbox Code Playgroud)
在我的services.yml里面,我有:
imports:
security_bundle:
resource: @AcmeSecurityBundle/Resources/config/services.yml
Run Code Online (Sandbox Code Playgroud)
然而,为bundle声明服务的替代方法是使用a,DependencyInjection
Extension
从而消除了手动将任何内容导入config.yml的需要,从而解耦代码.
namespace Acme\Bundle\SecurityBundle\DependencyInjection;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;
class AcmeSecurityExtension extends Extension {
public function load(array $configs, ContainerBuilder $container) {
$loader = new YamlFileLoader(
$container, new FileLocator(__DIR__ . '/../Resources/config')
);
$loader->load('services.yml');
}
}
Run Code Online (Sandbox Code Playgroud)
问题
这适用于服务声明,但是比如你想要一个包来配置另一个包,比如添加LiipImagineBundle
(就像AvalancheImagineBundle
)过滤器:
liip_imagine:
filter_sets:
security_avatar_thumbnail:
quality: 75
filters:
thumbnail: { size: [140, 140], mode: inset }
Run Code Online (Sandbox Code Playgroud)
然后Symfony抱怨说
没有可以加载"liip_imagine"配置的扩展程序
那么有谁知道是否有办法从另一个包中添加第三方包的配置而不触及config.yml
?
我正在使用liipImagineBundle并尝试将过滤器直接应用到控制器中.
在文档中,我找到了两个部分,其中解释了如何使用控制器中的liipImagineBundle.这一个https://github.com/liip/LiipImagineBundle#using-the-controller-as-a-service
public function indexAction()
{
// RedirectResponse object
$imagemanagerResponse = $this->container
->get('liip_imagine.controller')
->filterAction(
$this->getRequest(),
'uploads/foo.jpg', // original image you want to apply a filter to
'my_thumb' // filter defined in config.yml
);
// string to put directly in the "src" of the tag <img>
$srcPath = $imagemanagerResponse->headers->get('location');
// ..
}
Run Code Online (Sandbox Code Playgroud)
并https://github.com/liip/LiipImagineBundle/blob/master/Resources/doc/filters.md#dynamic-filters
public function filterAction(Request $request, $path, $filter)
{
$targetPath = $this->cacheManager->resolve($request, $path, $filter);
if ($targetPath instanceof Response) {
return $targetPath;
}
$image = $this->dataManager->find($filter, $path);
$filterConfig = …
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一些用户在后端上传图像的可能性.这些图像应该稍后在移动应用程序上呈现.
我处于开发的早期阶段,我想调整任何用户上传到服务器的图像.但是现在我在Wamp本地工作,当我想要将滤镜应用到大约1000X1000以下的图像时工作正常.然后不会过滤较大的图像,确实存储原始图像,但是应该转到web/media/cache的过滤的图像不是.
我现在似乎无法找到解决方案,我不得不说我是Symfony开发的初学者.我开始认为这与使用Wamp的缓存有关.
这是我在config.yml中的配置以获得更高的精度:
liip_imagine:
resolvers:
default:
web_path: ~
filter_sets:
my_small:
quality: 100
filters:
thumbnail: { size: [275, 100], mode: outbound }
my_big:
quality: 100
filters:
thumbnail: { size: [550, 550], mode: inset}
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过同样的问题?
我有一个项目,我将上传的图像保存在src/My/Bundle/Resources/uploads/images/full中,并使用twig过滤器imagine_filter
动态创建缩略图.
在我的本地机器上它可以完美地工作,在我的服务器上也是如此,但只有在开发环境下.当我删除以前创建的缩略图(仅保留完整目录)时,清除prod缓存并加载任何网页,不创建图像,其URL始终保留在媒体/缓存下,并且记录器为我提供request.ERROR
:
"No route found for "GET /uploads/images/avatar/354026c94b773b77ca945b4a6323e15c84102f6b.jpg"" at /<path>/app/cache/prod/classes.php line 1964 {"exception":"[object] (Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException: No route found for \"GET /uploads/images/avatar/354026c94b773b77ca945b4a6323e15c84102f6b.jpg\" at /<path>/app/cache/prod/classes.php:1964, Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException: at /<path>/app/cache/prod/appProdUrlMatcher.php:1816
Run Code Online (Sandbox Code Playgroud)
一些额外的信息:
thumbnail_min
是一个自定义过滤器):
liip_imagine:
loaders:
default:
filesystem:
data_root: %kernel.root_dir%/../web/uploads/images/full
resolvers:
default:
web_path:
web_root: %kernel.root_dir%/../web
cache_prefix: /uploads/images
cache: default
filter_sets:
avatar:
quality: 90
filters:
thumbnail_min: { size: 50, mode: inset }
....
full:
quality: 100
我只想努力工作LiipImagineBundle.
好的,我到目前为止所有:
在config.yml中添加了liip_imagine过滤器
使用php app/console路由器检查:debug和path _imagine_my_thumb存在.
但使用后:
<img src="{{ '/relative/path/to/image.jpg' | imagine_filter('my_thumb') }}" />
Run Code Online (Sandbox Code Playgroud)
图像未渲染,路径根本找不到错误.
prod.log表示Route _imagine_my_thumb不存在,虽然它存在,因为它使用router:debug来显示两种环境.
我做了以下事情:
img_path = 'abc.jpg'
<img src="{{ img_path | imagine_filter(filter) }}">
Run Code Online (Sandbox Code Playgroud)
所以我想有 url https
。目前我正在获取 url http
。
我已经设置router.request_context.scheme: https
了参数。但没有成功。
所以实际上我想将vendor/symfony/symfony/src/Symfony/Component/Routing/RequestContext.php
scheme
属性设置为https
.
symfony ×9
php ×3
amazon-s3 ×1
assets ×1
caching ×1
filter ×1
image ×1
symfony-2.1 ×1
symfony-2.8 ×1
wamp ×1