php://输入资源和字符串

时间:2012-04-21 20:08:44

标签: php inputstream

使用以下代码:

$file = fopen('php://input', 'r');
$temp = tmpfile();
$imageSize = stream_copy_to_stream($file, $temp);
$imageDimensions = getimagesize($file); // Error here
$imageInfos = pathinfo($_GET['selected-image']);

我收到此错误 getimagesize() expects parameter 1 to be string, resource given

因为$filefopen的资源。如果我无法阅读php://input两次,我如何拥有资源和字符串?


更新

我试过这个:

$file = fopen('php://input', 'r');
$tempName = tempnam(sys_get_temp_dir(), '.upload');
$imageSize = fwrite(fopen($tempName, 'w+'), stream_get_contents($file));
$imageDimensions = getimagesize($tempName);
$imageInfos = pathinfo($_GET['selected-image']);

// Unlinks and other stuffs

错误:

Notice: getimagesize() [function.getimagesize]: Read error! in 

谢谢!

2 个答案:

答案 0 :(得分:1)

由于getimagesize()只接受字符串文件名而不是资源,因此您需要使用tempnam()创建一个名称可以传递给getimagesize()的临时文件。

$file = fopen('php://input', 'r');
$tempName = tempnam('/var/tmp', 'img_');
$temp = fopen($tempName, 'w');
$imageSize = stream_copy_to_stream($file, $temp);
fclose($temp);
$imageDimensions = getimagesize($tempName);

这假设运行PHP的用户对目录/var/tmp具有写入和读取权限,但如果不是,则可以更改为用户具有r / w权限的目录。

答案 1 :(得分:1)

使用tempnam()生成临时文件,而不是tmpfile()。然后你有一个文件路径,你可以传递给getimagesize()

$file = fopen('php://input', 'r');
$tempname = tempnam('.', 'img');
$tempfile = fopen($tempname, 'w+');
$imageSize = stream_copy_to_stream($file, $tempfile);
$imageDimensions = getimagesize($tempname);
$imageInfos = pathinfo($_GET['selected-image']);

// At the end of the script, you need to remember to...
fclose($tempfile);
unlink($tempname);