【问题标题】:Uploading PNG file to nginx server via HTTP_RAW_POST_DATA results in corrupted image通过 HTTP_RAW_POST_DATA 将 PNG 文件上传到 nginx 服务器会导致图像损坏
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我在 Smultron 中打开了文件,复制了原始数据,打开了另一个文档,粘贴了数据,将编码更改为与原始文件 (ISO-5589-1) 相同并保存它。生成的输出是一个完美运行的 PNG 图像。问题不在于我的测试,而在于我猜想编码/写入文件的某个地方。
    【解决方案2】:

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

    我建议尝试一下。

    【讨论】:

    • 谢谢,但在我的情况下,我对如何将数据传递给脚本没有任何影响,所以除了读取 HTTP_RAW_POST_DATA 参数之外,我看不到任何其他方法。
    • 原始帖子数据不就是一切吗,包括字段名称等 - 这就是它会膨胀的原因吗?我还在 nginx 上成功使用 php://input 进行文件上传。
    • 生成的文件包含与我从中复制它的原始文件中的数据完全相同的数据。这意味着它可以正确地通过服务器传递,问题可能出在其他地方。
    【解决方案3】:

    尝试使用: 获取原始数据。我有时会使用它来获取从蛋糕上的 ajax 帖子发送的数据。

    【讨论】:

    • 谢谢,我已经用你建议的内容替换了该行,但是我仍然遇到问题,请参阅我的帖子的更新。
    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2012-08-03
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多