通过HTTP_RAW_POST_DATA将PNG文件上传到nginx服务器导致图像损坏

问题描述:

我试图通过在Postman的帮助下将原始PNG图像数据发布到服务器来调试此问题。这里有一个截图,这可能有助于理解这个问题:通过HTTP_RAW_POST_DATA将PNG文件上传到nginx服务器导致图像损坏

enter image description here

在我收到如下文件服务器:

$png = $GLOBALS["HTTP_RAW_POST_DATA"]; 

然后我将数据写入到一个新文件:

$fh = fopen($myFile, 'w') or die("can't open file"); 
fwrite($fh, $png); 
fclose($fh); 

的文件被正确保存,但现在有一个不同的文件大小, 417KB而非279KB这是origi的大小最终文件。

当然,我无法进行任何图像操作,因为没有任何功能(例如getimagesize返回bool(false))将文件识别为有效图像。

我已经调试此过程到问题必须在文件操作的某个地方,但我不明白为什么该文件只是不会导致与原始文件类型和大小相同的文件我正在做的唯一的事情就是使用相同的原始数据。

UPDATE:

我现在已经比使用上传, 而前者是ISO-8859-1,它正确地显示原始文件的编码,后者则是UTF-8和文件大小约为138kB。

现在我已经实现将服务器上的文件转换为ISO-8859-1。

fwrite($fh, iconv("UTF-8", "ISO-8859-1", $png)); 

生成的文件现在的确有相同的输出文件大小(279KB), 但它仍然是不被识别为一个PNG图像,有些信息似乎依然迷路。

UPDATE(1):

我已经能够进一步研究这个问题,并发现了,原来的文件是一个4个字节比生成的文件越大,因此导致PNG似乎已损坏。

Screenshot of the terminal showing the two different file sizes

UPDATE(2):

我现在可以保存文件并打开它作为一个有效的PNG。下面的代码似乎是正确保存图像:

$input   = fopen("php://input","r+"); 
$destination = fopen($myFile, 'w+'); 

stream_copy_to_stream($input, $destination); 

fclose($input); 
fclose($destination); 

然而试图打开与imagecreatefrompng函数的文件时,我得到一个500错误。我现在试图弄清楚它是否是PHP中的内存问题。

我使用nginx的上载,并没有问题,但是我用的文件上传为每标准的PHP方式:http://www.php.net/manual/en/features.file-upload.post-method.php

我会建议尝试这一点。

+0

谢谢,但在我的情况下,我对数据如何传递给脚本没有影响,所以除了读取HTTP_RAW_POST_DATA参数外,没有其他任何方法。 –

+0

是不是原始发布数据的一切,包括字段名称等 - 这就是为什么它会臃肿?我还使用php://输入,并在nginx上成功上传文件。 –

+0

生成的文件包含与我从中复制原始文件的数据完全相同的数据。这意味着它正确地通过服务器传递,问题可能在其他地方。 –

问题可能是您通过将“二进制”数据复制到文本字段来测试POST的方式。

如果将相同的数据粘贴到文本编辑器中,当使用png扩展名保存时,您将无法获得有效的图像文件。

尝试建立一个简单的表格文件中的字段来测试你的上传

+0

我在Smultron中打开了该文件,复制了原始数据,打开了另一个文档,粘贴了数据,将编码更改为与原始文件(ISO-5589-1)相同并保存。结果输出是一个功能完好的PNG图像。问题不在于我的测试,而在于编码/写入文件的地方。 –

尝试使用:< PHP $ POSTDATA =的file_get_contents( “PHP://输入”)?; ?> 获取原始数据。我多次使用它来获取从ajax邮件发送到蛋糕上的数据。

+0

谢谢,我用你提出的建议替换了这条线,但是我仍然遇到问题,请参阅我的帖子的更新。 –