警告:file_get_contents(effect.php?file=test.gif&bs=&negative=1([function.file-get-contents]:无法打开流:第19行C:''Users''[user]''Documents''NetBeansProjects''[site]''handler''img_replace.php中的结果太大
我在尝试访问从PHP脚本生成的图像时遇到了这个错误。我已经在谷歌上搜索了几个小时"无法打开流"answers"结果太大"的错误,我被难住了。
这是img_replace.php的代码:
try
{
$file = $_POST['file'];
$ref_get = $_POST['ref_get'];
$image = R::findOne(IMAGES_TABLE, "filename='$file'");
$image->data = file_get_contents("effect.php?" . htmlspecialchars_decode($ref_get));
R::store($image);
}
catch (Exception $ex)
{
echo $ex->getMessage();
}
这是effect.php的相关代码:
try
{
$image = R::findOne(IMAGES_TABLE, "filename='$file'");
$mimetype = $image->mimetype;
$filename = $image->filename;
$data = $image->data;
header("content-type: $mimetype");
header("content-disposition: filename=$filename");
$src_img = imagecreatefromstring($data);
//manipulate the image
echo imagepng($out_img);
}
catch (Exception $ex)
{
$message_ref = $ex->getMessage();
echo $ex->getMessage();
}
当目标文件是普通图像文件时,file_get_contents可以工作,但我不想把文件写到磁盘上一次读取然后擦除(另外,如果我试图在除effect.php之外的任何地方进行操作,我可能会遇到同样的错误(。此外,生成的图像有多大也无关紧要,因为我甚至用8x8像素的测试图像进行了尝试,但仍然会出现错误。
很明显,我尝试过使用file_get_contents以外的其他方法,包括本页上的示例#2:http://www.php.net/manual/en/function.fread.php
我还检查了我的php.ini文件,内存限制是128MB。
有什么想法吗?
编辑:我能够让脚本基本上做我想做的事情,而且可能更好,因为现在它不会在表中两次查找同一个图像。然而,我仍然不得不采取写入磁盘的中间步骤,并且我仍然没有解决"Result too large"错误。我也不喜欢effect.php根据get值有完全不同的行为。
这是新的img_replace.php:
<?php
require_once "../include/session.php";
require_once "../include/vars.php";
$ref_get = $_POST['ref_get'];
header("location: effect.php?" . htmlspecialchars_decode($ref_get) . "&apply=1");
exit();
下面是添加到effects.php的代码:
if($apply && $ref_base == "index.php?p=ucp")
{
$filename = "../tmp/temp.png";
imagepng($out_img,$filename);
$handle = fopen($filename, "rb");
$image->data = fread($handle, filesize($filename));
fclose($handle);
unlink($filename);
R::store($image);
header("location: ../index.php?p=ucp&act=gallery");
exit();
}
else
{
header("content-type: $mimetype");
header("content-disposition: filename=$filename");
}
在我的Windows localhost上使用了上面发布的pesudo解决方案几天后,我将脚本上传到了我的大学的comp sci服务器上,以便在在线环境中进行测试,尽管将tmp上的permissions设置为777,但无法让它们将文件写入磁盘。我没有试图解决最有可能是故意限制的问题,而是回到了输出缓冲区的想法。
这个解决方案看似简单。
ob_start();
if($fmt == "jpeg")
{
$imagefunc($out_img,null,$quality);
}
else
{
$imagefunc($out_img);
}
$image->data = ob_get_contents();
ob_end_clean();
$filesize_bytes = strlen($image->data);
$filesize_kb = (int)($filesize_bytes / 1024.0 + 0.5);
if($filesize_kb <= $max_filesize && $filesize_bytes > 0)
{
$gallery = R::findOne(GALLERIES_TABLE, "filename='$file'");
$image->filename = stripExt($image->filename) . ".$fmt";
$gallery->filename = stripExt($gallery->filename) . ".$fmt";
$image->mimetype = "image/$fmt";
R::store($image);
R::store($gallery);
$message_ref = "Effects applied successfully. New filesize: " . $filesize_kb . "KB";
}
else if($filesize_bytes == 0)
{
throw new Exception("Error: Unable to create temp image");
}
else
{
throw new Exception("New file too large (" . $filesize_kb . "KB); replacement canceled");
}
当然,我仍然不知道如何存储由外部脚本生成的原始数据,但至少现在我已经实现了不必将文件写入磁盘的目标。