【发布时间】:2012-10-31 00:39:09
【问题描述】:
我正在尝试通过在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。
当然,现在我不能执行任何图像操作,因为没有一个函数(例如返回 bool(false) 的getimagesize)将文件识别为有效图像。
我已将此过程调试到问题一定出在文件操作中的某个点,但我不明白为什么文件不会产生与原始文件完全相同的文件类型和大小,当我唯一要做的就是使用相同的原始数据。
更新:
我现在比较了原始文件和上传文件的编码, 前者采用 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 中的内存问题。
【问题讨论】:
标签: php post file-upload nginx png