无法在脚本之外存储PHP生成的图像; “结果太大”

时间:2011-04-13 04:14:23

标签: php image

  

警告:file_get_contents(effect.php?file = test.gif& bs =& negative = 1)[function.file-get-contents]:无法打开流:C:\ Users \ [结果太大第19行的用户] \ Documents \ NetBeansProjects \ [site] \ handler \ img_replace.php

尝试访问从PHP脚本生成的图像时出现此错误。我一直在谷歌搜索“未能打开流”和“结果太大”错误几个小时,我很难过。

这是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在目标文件是普通图像文件时有效,但我宁愿不将文件写入磁盘以便一次读取然后擦除(如果我尝试在任何地方执行此操作,我可能会得到相同的错误但效果。 PHP)。此外,生成的图像有多大并不重要,因为我甚至尝试使用8x8像素测试图像并仍然出现错误。

我显然尝试使用除file_get_contents之外的其他方法,包括此页面上的示例#2:http://www.php.net/manual/en/function.fread.php

我还检查了我的php.ini文件,内存限制为128MB。

有什么想法吗?


编辑:我能够让脚本基本上完成我想要的操作,并且它可能更好,因为现在它不会通过表查找两次相同的图像。但是,我仍然不得不采取写入磁盘的中间步骤,我仍然没有解决“结果太大”的错误。我也不喜欢effect.php具有完全不同的行为,具体取决于获取值。

这是新的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");
    }

1 个答案:

答案 0 :(得分:0)

在我的Windows localhost上使用上面发布的pesudo-solution几天之后,我将脚本上传到我的uni的comp sci服务器,以便在在线环境中进行测试,尽管设置了perimissions,但无法让他们将文件写入磁盘在tmp到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");
        }

当然,我仍然不知道如何存储由外部脚本生成的生成的原始数据,但至少现在我已经达到了我永远不必将文件写入磁盘的目标。