Php 通过HTTP_RAW_POST_数据将PNG文件上载到nginx服务器会导致图像损坏

Php 通过HTTP_RAW_POST_数据将PNG文件上载到nginx服务器会导致图像损坏,php,post,file-upload,nginx,png,Php,Post,File Upload,Nginx,Png,我试图通过在的帮助下将原始PNG图像数据发布到服务器来调试这个问题。下面是一个屏幕截图,它可能有助于理解问题: 在服务器上,我收到的文件如下: $png = $GLOBALS["HTTP_RAW_POST_DATA"]; 然后我将数据写入一个新文件: $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $png); fclose($fh); 文件保存正确,但现在文件大小不同, 417KB,而不是原始文件的大小27

我试图通过在的帮助下将原始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中的内存问题。

我使用nginx进行上传,没有问题,但我使用标准的PHP方式上传文件,如下所示:


我建议您尝试一下。

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

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


尝试构建一个带有文件字段的简单表单来测试您的上传

尝试使用:<?php$postdata=file\u get\u contents(“php://input"); ?>
获取原始数据。我有时使用它来获取从ajax post on cake发送的数据。

谢谢,但在我的例子中,我对数据如何传递到脚本没有任何影响,所以除了读取HTTP_RAW_post_data参数之外,我看不到任何其他方法。RAW post数据不就是一切,包括字段名等吗?这就是为什么它会膨胀的原因吗?我也用过php://input 在nginx上成功上传文件。生成的文件包含的数据与我复制它的原始文件中的数据完全相同。这意味着它被正确地传递到服务器上,问题可能出在其他地方。我在Smultron中打开了文件,复制了原始数据,打开了另一个文档,粘贴了数据,将编码更改为与原始文件(ISO-5589-1)相同的编码,并保存了它。结果输出是一个功能完美的PNG图像。问题不在于我的测试,而在于编码/编写文件。谢谢,我已经用你建议的内容替换了这一行,但是我仍然有问题,请参阅我文章的更新。