步骤23:调整图片大小

5.2版本
维护 不明意

调整图片大小

在会议页面的设计上,照片的最大尺寸被限制在200 * 150像素。如果上传的原始图像大于限制,如何优化图像并减少其大小?

这是一个完美的作业,可以添加到评论工作流程中,可能只是在评论验证后且只是在发布之前。

让我们添加一个新的准备好国家和一个优化过渡:

patch_file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 22 22 22 22
——/ config /包/ workflow.yaml+++ b / config / packages / workflow.yaml@@ -16,6 +16,7- potential_spam -垃圾邮件-被拒绝+  - 准备- 发布过渡:接受:@@ -29,13 +30,16 @@框架:到:垃圾邮件发布:来自:poluate_spam-:发表+至:准备好拒绝:来自:position_spam to:拒绝publish_ham:来自:火腿-:发表+至:准备好extream_ham:来自:火腿:拒绝+优化:+:准备好了发表的:+

生成新的工作流配置的可视化表示,以验证它描述了我们想要的内容:

1
$ ob娱乐下载symfony控制台工作流程:转储评论|. . -Tpng -o workflow.png
../_images/workflow-final.png

使用Imagine优化图像

谢谢图像优化GD(检查您的本地PHP安装是否已启用GD扩展)和想象一下

1
$ ob娱乐下载symfony作曲家要求“想象一下/想象:^ 1.2”

调整图像大小可以通过以下服务类完成:

src / ImageOptimizer.php
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
命名空间应用程序想象一下\ gd \想象一下想象\图像\框ImageOptimizer私人常量MAX_WIDTH200.私人常量最大高度150私人美元的想象民众功能__construct()这个美元- >想象一下新的想象一下();民众功能调整字符串$ filename.空白列表iwidth美元$ iheight.getimagesize$ filename.);$比例iwidth美元/$ iheight.美元的宽度自己::MAX_WIDTH$高度自己::最大高度如果美元的宽度/$高度>$比例美元的宽度$高度$比例其他的$高度美元的宽度/$比例美元的照片这个美元- >想象一下- >开放$ filename.);美元的照片- >调整新的盒子美元的宽度$高度))- >保存$ filename.);

在优化了照片之后,我们将新文件存储在原始文件的位置。不过,您可能想保留原始图像。

在工作流程中添加新步骤

修改工作流以处理新状态:

patch_file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
--- a / src / messageHandler / compoundmessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -2,6 + 2,7 @@命名空间app \ messageHandler;+使用App \ ImageOptimizer;使用App \ \ CommentMessage消息;使用App \ Repository \ CommentRepository;使用App \ SpamChecker;@@类CommentMessageHandler实现MessageHandlerInterface私人班车;私人$工作流程;私人$邮箱;+私人imageOptimizer美元;私人adminEmail美元;+私人photoDir美元;私人$ logger;- 公共功能__Construct(EntityManagerInterface $ EntityManager,Spamchecker $ Spamchecker,CommentRepository $ CommentRepository,MessageBusInterface $总线,WorkFlowInterface $ CompougeStateMachine,MailerInterface $ Mailer,String $ Adminemail,LoggerInterface $ logger = null)+ public function __construct(EntityManagerInterface $entityManager, SpamChecker $ SpamChecker, CommentRepository $ CommentRepository, MessageBusInterface $bus, WorkflowInterface $commentStateMachine, MailerInterface $mailer, ImageOptimizer $ ImageOptimizer, string $adminEmail, string $photoDir, LoggerInterface $logger = null) / /创建一个新的目录{$this->entityManager = $entityManager;$ this - > spamChecker = $ spamChecker;@@ -32,7 +35,9 @@ class CommentMessageHandler实现MessageHandlerInterface$ this - >总线= $总线;= $ $ this - >工作流commentStateMachine;$ this - >梅勒= $梅勒;+ $this->imageOptimizer = $imageOptimizer;$以下 - > adminemail = $ adminemail;+ $以下 - > photodir = $ photodir;$以下 - > logger = $ logger;}@@类CommentMessageHandler实现MessageHandlerInterface- > ($ this - > adminEmail) - >上下文([“评论”= > $评论]));+} elsef($ this-> workflow-> can($ compy,'优化')){+ if ($comment->getPhotoFilename()) {+ $ this - > imageOptimizer - >调整($ this - > photoDir‘/’。评论- > getPhotoFilename ());+}+ $ this - >工作流- >应用(美元评论,“优化”);+ $ this - > entityManager - >冲洗();} elsef($ this-> logger){$ this-> logger-> debug('dropping注释消息',['评论'=> $ compy-> getId(),'state'=> $评论 - > getState()]);}

请注意,photoDir美元是在定义容器时自动注入的吗绑定在前面的步骤中对这个变量名:

配置/包/ services.yaml
1 2 3 4
服务_defaults绑定photoDir美元“%kernel.project_dir%/ public /上传/照片”

将上传的数据存储在生产中

我们已经为上传的文件定义了一个特殊的读写目录.ob娱乐下载syob直播appmfony.cloud.yaml.但这个数量是本地的。如果我们希望web容器和消息消费者worker能够访问相同的挂载,我们需要创建一个文件服务

patch_file
1 2 3 4 5 6 7 8 9 10
--- a /ob娱乐下载 .symfony / services.yaml+ + + bob娱乐下载 / .symfony / services.yaml@@ 19,3 +19,7包含类型:字符串路径:config.vcl++文件:+类型:网络存储:1.0+磁盘:256

使用它的照片上传目录:

patch_file
1 2 3 4 5 6 7 8 9 10 11
——/ .syob娱乐下载mfob直播appony.cloud.yaml+++ b /ob娱乐下载 .ob直播appsymfony.cloud.yaml@@ -37,7 +37,7mount: "/var": {source: local, source_path: var}- "/public/uploads": {source: local, source_path: uploads}+ "/public/uploads": {source: service, service: files, source_path: upload}钩子:构建:|

这应该足以使特征在生产中工作。


这项工作包括代码样本,在a下获得许可Creative Commons By-NC-SA 4.0许可证。