2

我正在尝试通过在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。

当然,现在我不能进行任何图像操作,因为没有一个函数(例如getimagesizewhich 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 中的内存问题。

4

3 回答 3

1

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

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

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

于 2012-10-25T12:23:49.697 回答
0

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

我建议尝试一下。

于 2012-10-25T12:10:49.270 回答
0

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

于 2012-10-25T15:26:45.717 回答