这是我向Stack Overflow发表的第一篇文章,如果我使用了错误的格式或约定,请原谅我。我正在尝试编写一个测试场景,该场景从网页POST(multipart / form-data)接收png图像,剥离已发布的图像并将其转发给第三方作为Content-Type:image / png。< / p>
我有一个php文件(catcher.php),它是转发图像的收件人。 Post.php,将上传的图像发布到catcher.php的php文件如下:
<?php
$img = imagecreatefrompng($_FILES['myfile']['tmp_name']);
imagepng($img);
$opts = array(
'http'=>array(
'method'=>"POST",
'content'=>$img,
'header'=>"Content-Type: image/png\r\n"
)
);
$context = stream_context_create($opts);
file_get_contents( "http://localhost/catcher.php", false, $context);
?>
Post.php从将其发布为multipart / form-data的网页上获取文件很好,但是我不确定如何访问catcher.php中的image / png内容。
我的问题是,在catcher.php中,我该如何访问图像内容?我尝试过$ _POST ['content']并获得以下错误:“Undefined index:content”。所以我知道我不是在寻找正确的数据。是否有一个特定的超全局变量,如$ _POST或$ _REQUEST,我可以使用它来访问已发布的图像内容,还是有其他解决方案?
解决 我能够使用以下catcher.php代码找到我要查找的结果:
$input = fopen("php://input","+r");
$destination = fopen($target_path, 'w');
stream_copy_to_stream($input, $destination);
fclose($input);
fclose($destination);
?>
感谢Marc和Brenden你的权宜之计!
答案 0 :(得分:3)
imagepng($img)
立即输出包含PNG的二进制垃圾。它没有被捕获到变量中。你实际发布的是一个字符串,可能是“GD Resource#7”或类似的东西。
整个imagepng()位无论如何都是无用的 - 您将PNG解码为内存中表示,然后再次尝试重新编码为PNG。毫无意义的内存浪费,因为文件已经存在于磁盘上。你可以完成整个事情:
<?php
if ($_FILES['myfile']['error'] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES['myfile']['error']);
}
$opts = array(
'http'=>array(
'method'=>"POST",
'content'=> file_get_contents($_FILES['myfile']['tmp_name']),
'header'=>"Content-Type: image/png\r\n"
)
);
$context = stream_context_create($opts);
file_get_contents( "http://localhost/catcher.php", false, $context);
请注意添加检查上传成功 - 假设上传成功将导致您感到悲痛。
话虽如此,你也没有做正确的POST文件上传。要实现这一点,您必须实际模拟一个包含<input type="file">
的完整HTML表单,以及enctype="multipart/form-data"
和诸如此类的内容。您所做的只是将原始PNG发送到服务器。
您可以通过阅读捕手脚本中的php://input
来检索它。
答案 1 :(得分:1)
问题是您的数据未编码为multipart/form-data,而只是PNG。
您有两种选择:
$_POST
或$_REQUEST
阅读。post.php
状态并阅读catcher.php
中php://input的原始数据。对于选项1,看起来HttpRequest会为您处理表单编码。