我有一个post
向/usr/bin/php-cgi
. 该脚本在处理纯文本时工作正常,但在数据为二进制时失败:
$data = file_get_contents('example.jpg');
$size = filesize('example.jpg') + 5;
$post_data = 'file='.$data;
$response = shell_exec('echo "'.$post_data.'" |
REDIRECT_STATUS=CGI
REQUEST_METHOD=POST
SCRIPT_FILENAME=/example/script.php
SCRIPT_NAME=/script.php
PATH_INFO=/
SERVER_NAME=localhost
SERVER_PROTOCOL=HTTP/1.1
REQUEST_URI=/example/index.html
HTTP_HOST=example.com
CONTENT_TYPE=application/x-www-form-urlencoded
CONTENT_LENGTH='.$size.' php-cgi');
我收到以下错误:
sh:-c:第 1 行:查找匹配的“”时出现意外 EOF
sh:-c:第 5 行:语法错误:文件意外结束
我想这是因为我要发送的数据是二进制的,必须以某种方式进行编码/转义。
就像我说的,如果数据是纯文本,上面的代码就可以工作:
$post_data = "data=sample data to php-cgi";
$size = strlen($post_data);
我也尝试使用对数据进行编码,base64_encode()
但后来我面临另一个问题;数据必须从接收脚本中解码。我在想也许我可以对数据进行编码base64
,然后添加一些内容或 mime 类型的标题来强制php-cgi
二进制文件进行对话?
另一个问题是我喜欢将数据作为附件发送,因此我认为我们必须设置CONTENT_TYPE
tomultipart/form-data; boundary=<random_boundary>
和CONTENT_DISPOSITION
to form-data
,但我不确定如何从命令行设置这些标头。