我正在尝试通过在Postman的帮助下将原始 PNG 图像数据发布到服务器来调试此问题。这是一个屏幕截图,可能有助于理解这个问题:
在服务器上,我收到的文件如下:
$png = $GLOBALS["HTTP_RAW_POST_DATA"];
然后我将数据写入一个新文件:
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, $png);
fclose($fh);
该文件已正确保存,但它现在具有不同的文件大小,417KB 而不是原始文件的大小 279KB。
当然,现在我不能进行任何图像操作,因为没有一个函数(例如getimagesize
which returns bool(false)
)将文件识别为有效图像。
我已经将此过程调试到问题必须在文件操作中的某个地方,但我不明白为什么文件不会导致与原始文件完全相同的文件类型和大小,当我唯一的事情我正在使用相同的原始数据。
更新:
我现在将原始文件的编码与上传的文件进行了比较,前者采用 ISO-8859-1 且显示正确,后者采用 UTF-8 且文件大小增加了约 138kB。
现在我已经实现了将服务器上的文件转换为 ISO-8859-1。
fwrite($fh, iconv("UTF-8", "ISO-8859-1", $png));
生成的文件现在确实具有相同的输出文件大小 (279kB),但仍无法识别为 PNG 图像,某些信息似乎仍然丢失。
更新(1):
我已经能够进一步检查问题并发现原始文件比生成的文件大 4 个字节,因此生成的 PNG 似乎已损坏。
更新(2):
我现在可以保存文件并将其作为有效的 PNG 打开。以下代码似乎正确保存了图像:
$input = fopen("php://input","r+");
$destination = fopen($myFile, 'w+');
stream_copy_to_stream($input, $destination);
fclose($input);
fclose($destination);
但是,当尝试使用该imagecreatefrompng
功能打开文件时,出现 500 错误。我现在正试图弄清楚这是否是 PHP 中的内存问题。