Symfony 2.1.11 图像数据响应在响应正文的开头添加了额外的字节

Posted

技术标签:

【中文标题】Symfony 2.1.11 图像数据响应在响应正文的开头添加了额外的字节【英文标题】:Symfony 2.1.11 Image Data Response adding additional byte to start of response body 【发布时间】:2019-03-13 21:09:52 【问题描述】:

我正在尝试为一个没有预算重新编写以将其升级到更现代的东西的客户恢复一个旧的 Symfony 2.11 项目。 其中一条路线在其响应中提供原始图像数据

$resp = new Response($imageData);
file_put_contents('./image.jpg', $imageData);
$resp->headers->set('Content-Type', $mime);
return $resp;

保存到image.jpg 的图像有效,可以按预期打开和工作,但是在发出请求时,响应会返回相同的数据,但多了一个第一个字节 - 十六进制字节 0A - 我该如何防止这种情况发生添加额外的字节,因为它阻止浏览器呈现图像。

使用 Symfony 2.1.11,如果不会花费太长时间或导致太多问题,愿意考虑升级,但这是一个相当庞大的项目,所以我担心升级的后果,当它显然在工作时一点基于它的当前配置。

【问题讨论】:

你能先展示一下代码是如何生成图像的吗?还有,为什么要发送给客户的时候用file_put_contents保存文件? file_put 仅供我调试,以检查图像是否有效。我可以得到代码,但不幸的是它在保存之前通过了大约 3 个控制器。简短的版本是有一个前端 web 控制器和一个后端 API,图像以二进制形式从前端传递到 API,在那里它被验证、调整大小并存储在磁盘上。我想重写,以便 API 直接提供实际图像,但没有重写预算。虽然 $imageData 变量在传递给 file_put 时会产生完美的图像,但是如果我 curl 请求 url,我会得到带有 LF 的图像。 其他控制器的响应是否也会产生额外的 LF 字节? 我必须仔细检查一下,所有其他响应都是 JSON,所以没关系。我发现仅仅创建一个空响应就会产生一个带有新行的响应。 这听起来绝对像是有人在你的项目中弄乱了 Symfony 核心代码。因为它已经很老了,我认为vendor/* 的内容已经提交到了 repo,对吧?如果是这样,请在您的 VCS 中检查您的团队是否修改了任何文件。 【参考方案1】:

0A 是一个 LF 或 \r 字符,在 Windows 系统上是一个换行符(或者,实际上是换行符)。

由于我不知道图像数据是如何生成的,所以我必须在这里做出假设:有时,当有人编辑 php 文件并意外在打开 PHP 标记之前添加了一个额外的换行符时,会弹出额外的 LF .但在这种情况下,您会在尝试发送响应时立即收到警告,例如 Headers already sent …。因此,额外的行似乎以某种不同的方式潜入$imageData。 [我将在图像生成代码添加到问题后立即更新这部分。]

一个肮脏的解决方法是在进一步处理之前从$imageData 中删除0A,尽管我建议尝试找到将额外行添加到图像数据的位置并修复它。

【讨论】:

感谢您的帮助,$imageData 是 file_get_contents(image_file) 工作正常。并且 file_put_contents($imageData) 还会生成一个工作图像,当数据添加到 Response 类时,必须添加要添加的 LF。我怀疑这是一个新的行错误——我已经运行了所有编写和使用的类,没有出现任何行错误,我已经开始查看 Symfony 响应类文件中的类,但不能在那里发出问题。我真的不知道如何在这种情况下应用快速和肮脏的修复,我不能在做出响应之前删除第一个字节,因为那是有效数据。

以上是关于Symfony 2.1.11 图像数据响应在响应正文的开头添加了额外的字节的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 4 JWT:访问 api 时我无法从控制器获得响应

Symfony 5 / 请求响应:使用 Ajax 获取数据

Symfony2 - 具有关系的实体作为 json 响应

Symfony / Ajax:成功响应时调用函数

如何在 symfony2 控制器中发送 JSON 响应

为啥 Symfony 2 在我的环境中响应非常缓慢?