PHP提供的图片始终损坏

时间:2018-07-13 19:56:25

标签: php apache

每当我尝试使用PHP提供图片时,它都会说明该图片已损坏/损坏,并在Google Chrome浏览器中给出以下警告:

  

资源被解释为文档,但以MIME类型传输   图片/ png

但是,情况如下;

  1. 此脚本可在多台服务器上正常运行,但不能在此服务器上运行。
  2. 我使用了多个图片和扩展名
  3. 如果我将这些图像作为base64解码图像放在img src中,则这些图像可以很好地工作
  4. 出于测试目的,我将其放在index.php的第一行中,没用
  5. 我的文件不是UTF-8 BOM
  6. 我个人看不到任何惊喜标题

我尝试过的例子:

$imgpath = 'assets/img/dropdown-arrow.png';
$type      = pathinfo($imgpath, PATHINFO_EXTENSION);
$data      = file_get_contents($imgpath);
$base64    = 'data:image/' . $type . ';base64,' . base64_encode($data);
header('Content-Type: image/png;'); // also tried with charset=UTF-8 and such
echo base64_decode($base64);
exit();

示例2(在其他服务器上工作的示例):

// Set the content type header - in this case image/png
header('Content-Type: image/png; charset=UTF-8');
// integer representation of the color black (rgb: 0,0,0)
$background = imagecolorallocate($img, 0, 0, 0);

// removing the black from the placeholder
imagecolortransparent($img, $background);

// turning off alpha blending (to ensure alpha channel information
// is preserved, rather than removed (blending with the rest of the
// image in the form of black))
imagealphablending($img, false);

// turning on alpha channel information saving (to ensure the full range
// of transparency is preserved)
imagesavealpha($img, true);

// Output the image
imagepng($img);

---再说一次;我已经把我的框架切成中间人了,试图直接从index.php的第一行开始运行。

因此,出于某种奇怪的原因,我将content-type设置为image/png的那一刻;一切都很艰难。

有人会知道为什么会发生这种情况吗?这是我的代码遗漏的东西吗?这是我无法用我的代码(服务器端)解决的问题吗?我只是想念一些非常明显的东西吗?


基本服务器信息:

我正在使用PHP-FPM在Apache 2.4.5上运行。 (尽管切换到PHP-FASTCGI并没有改变)在PHP 7.2.3上


响应标题:

连接:保持活动状态

内容类型: image / png

日期::格林尼治标准时间2018年7月13日星期五19:51:37

保持活动:超时= 5,最大= 99

服务器:Apache / 2.4.25(Debian)

传输编码:分块


更新/修复

显然,有人(不是我,是真的!)在<?php标记之前的一个空格中放置了一个小文件,该文件已包含在MVC中。删除该空间可解决每个问题。因此,花了好几个小时才找到适合所有阅读者的课程:请确保您的代码格式正确,并始终将<?php标签放在一开始。

2 个答案:

答案 0 :(得分:3)

您可以直接输出它,而无需执行base64_encode / decode

$imgpath = 'assets/img/dropdown-arrow.png';
$data    = file_get_contents($imgpath);
header('Content-Type: image/png;');
echo $data;
exit();

答案 1 :(得分:0)

在示例2中,标题表示您的数据是utf8编码的。 为什么? 您的数据是二进制文件 而且没有utf8编码