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

时间:2012-10-25 12:06:14

标签: php post file-upload nginx png

我正在尝试通过Postman的帮助将原始PNG图像数据发布到服务器来调试此问题。这是一个屏幕截图,可能有助于理解这个问题:

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,这是原始文件的大小。

当然,我无法进行任何图像操作,因为没有任何函数(例如返回getimagesize的{​​{1}})将文件识别为有效图像。

我已经调试了这个过程,问题必须在文件操作中的某个地方,但我不明白为什么文件不会导致与原始文件类型和大小完全相同的文件,当我所做的只是使用相同的原始数据。

更新:

我现在将原始文件的编码与上传的文件进行比较, 前者是ISO-8859-1,它显示正确,后者是UTF-8,文件大小多了138kB。

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

bool(false)

生成的文件现在具有相同的输出文件大小(279kB), 但它仍未被识别为PNG图像,一些信息似乎仍然丢失。

更新(1):

我已经能够进一步检查这个问题并发现原始文件比生成的文件大4个字节,因此生成的PNG似乎已损坏。

Screenshot of the terminal showing the two different file sizes

更新(2):

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

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

但是,当尝试使用$input = fopen("php://input","r+"); $destination = fopen($myFile, 'w+'); stream_copy_to_stream($input, $destination); fclose($input); fclose($destination); 函数打开文件时,我收到500错误。我现在正试图弄清楚它是否是PHP中的内存问题。

3 个答案:

答案 0 :(得分:1)

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

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

尝试使用文件字段构建一个简单的表单来测试上传

答案 1 :(得分:0)

我使用nginx进行上传并没有遇到任何问题,但我按照标准的PHP方式上传文件:http://www.php.net/manual/en/features.file-upload.post-method.php

我建议尝试一下。

答案 2 :(得分:0)

尝试使用:< ?php $ postdata = file_get_contents(“php:// input”); ?> 获取原始数据。我有时会用它来从蛋糕上的ajax帖子中发送数据。