gpt4 book ai didi

php - 如何处理发布到 PHP 的非 base64 编码的图像?

转载 作者:可可西里 更新时间:2023-10-31 22:43:11 26 4
gpt4 key购买 nike

我正在尝试为将图像数据错误地发布到我的 PHP 表单的桌面客户端提供追溯支持。

问题是发布的图像数据没有经过 base64 编码,我无法更改分布式客户端,所以我想知道我是否可以在服务器端做一些事情。

通过以下方式写入服务器时的图像数据

file_put_contents($filePath,$_POST['rawImageData']);

导致损坏的 JPEG(我知道所有上传的图像都是 JPEG)。

编码似乎是默认的 HTTP POST 编码,ISO-8859-1。

我试过使用 iconv、utf_decode、mb_convert_encoding 和其他几个方法转换发布的数据,但没有成功。

在这种情况下是否可以恢复?

最佳答案

PHP 可能未正确填充 $_POST 数组,因为它将 JPEG 数据解释为可能包含 & 字符或其他会混淆它的内容的表单数据。如果您手动读取输入流而不是依赖于 $_POST,您应该能够恢复您的数据。

我写了一些快速代码来尝试重现您的问题并对此进行测试:

client.php

此代码模拟您的客户端;它只是读取一个 JPEG 文件并通过 POST 请求将其原始写入。

$url = 'http://localhost/server.php';
$input = __DIR__ . '/input.jpg';

$parts = parse_url($url);
$sock = fsockopen($parts['host'], 80);

$out = "POST ".$parts['path']." HTTP/1.1\r\n";
$out.= "Host: ".$parts['host']."\r\n";
$out.= "Content-Type: application/x-www-form-urlencoded\r\n";
$out.= "Content-Length: ".(filesize($input) + strlen("rawImageData="))."\r\n";
$out.= "\r\n";
$out.= "rawImageData=";

fwrite($sock, $out);
$fd = fopen($input, 'r');
stream_copy_to_stream($fd, $sock);
fclose($fd);
fclose($sock);

server.php(版本 1)

这会尝试像您的代码那样使用 $_POST 值。

$tmp = "/tmp/output.jpg";
file_put_contents($tmp, $_POST['rawImageData']);

server.php(版本 2)

这从 POST 正文中读取原始输入流。

$tmp = "/tmp/output.jpg";
$fd = fopen('php://input', 'r');
fread($fd, strlen("rawImageData=")); //throw this data out
$out = fopen($tmp, 'w');
stream_copy_to_stream($fd, $out);
fclose($out);
fclose($fd);

对于 input.jpg,我使用了来自维基百科的 ~10k JPEG 文件。

结果

服务器版本 1 只向 output.jpg 写入大约 50 个字节,当我尝试用查看器打开它时,出现损坏的 JPEG 错误。服务器版本 2 写入了完整的 10k 字节,我的 JPEG 查看器显示图像也很好。

关于php - 如何处理发布到 PHP 的非 base64 编码的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25172780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com