【问题标题】:Problem with php function to catch error on saving imagephp函数在保存图像时捕获错误的问题
【发布时间】:2009-02-10 14:12:12
【问题描述】:

我有一个保存图像的方法,它可以优雅地处理错误,在失败时将 $imageSrc 设置为特定图像。如果图像存在,我的方法可以正常工作,但似乎没有正确处理错误情况。

$imageSrc = save_pic($PIC_URL, $pk);

function save_pic($pic_url, $pk) {
    $imageDir = './';
    if (!strlen($pic_url))
            return "removed.jpg";
    if (!is_dir($imageDir) || !is_writable($imageDir)) {
        return "removed.jpg";
    }
    $image = file_get_contents($pic_url);
    if (empty($image)) {
        return "removed.jpg";
    }
    $r = file_put_contents($imageDir.$pk.".jpg", $image);
    if ($r) {
            return "./$pk.jpg"; 
    } else {
            return "removed.jpg";
    }
}

如果图像不存在,我会得到:

Warning: getimagesize(http://127.0.0.1/555.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in C:\Program Files\EasyPHP 2.0b1\www\get_auction.php on line 144

Array (
 [type] => 2 [message] => getimagesize(http://127.0.0.1/555.jpg)
 function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
 [file] => C:\Program Files\EasyPHP 2.0b1\www\get_auction.php
 [line] => 144
) 1

returned.jpg 在任何情况下都不会返回。

编辑:添加 imageResize 代码:

function imageResize($imageURL, $maxWidth, $maxHeight)

{

global $outputWidth, $outputHeight, $maxWidth, $maxHeight;

$size = getimagesize($imageURL);

if ($size) {

    $imageWidth  = $size[0];

    $imageHeight = $size[1];

    $wRatio = $imageWidth / $maxWidth;

    $hRatio = $imageHeight / $maxHeight;

    $maxRatio = max($wRatio, $hRatio);



    if ($maxRatio > 1) {

        $outputWidth = $imageWidth / $maxRatio;

        $outputHeight = $imageHeight / $maxRatio;

    } else {

        $outputWidth = $imageWidth;

        $outputHeight = $imageHeight;

    }

} else {

    die(print_r(error_get_last()));

}

}

【问题讨论】:

  • PHP 不是疯了还是什么! :) ...“一个 .Net 家伙”;)
  • 这里缺少代码... getimagesize 消息来自哪里?
  • 目前尚不清楚您在什么时候从其他代码调用 imageResize()。请重新组织以提供包括当前错误消息在内的所有内容,如果您仍然无法自行修复,谢谢。

标签: php


【解决方案1】:

您确定要写入根文件夹吗?因为我看不出您的代码有任何问题。 file_get_contentsfile_put_contents 似乎没有失败,所以你的图像正在某处写入。

【讨论】:

  • 但它不处理不存在的文件以便获取
  • so file_get_contents 应该返回 FALSE 但不返回,对吗?
  • 没错,问题不在于文件夹可写,而在于网址中不存在图像
【解决方案2】:
 $image = file_get_contents("http://example.com/test.png");
 list($ver, $retcode, $message) = explode(' ', $http_response_header[0], 3);
 if ($retcode != 200) {
   return "removed.jpg";
 }

$retcode 将包含 HTTP 响应代码。

请在此处发布此$retcode 以及您的strlen($image) 返回的内容,这可能有助于解决您的问题。

【讨论】:

  • 我按照你的建议把它放在我的代码中,只输出file_Get_contens错误,之后什么都没有。
  • 在 file_get_contents 之后得到它吗?在 file_get_contents 之后放一个 echo 看看它是否到达那里。
【解决方案3】:

试试这个:

<?php
$imageSrc = save_pic($PIC_URL, $pk);

function save_pic($pic_url, $pk) 
{
    $imageDir = './';

    if (!strlen($pic_url))
    {
        return 'removed.jpg';
    }

    if(!is_dir($imageDir) || !is_writable($imageDir)) 
    {
        return 'removed.jpg';
    }

    if(!file_exists($pic_url))
    {
        return 'removed.jpg';
    }

    if (file_put_contents($imageDir . $pk . '.jpg', file_get_contents($pic_url))) 
    {
            return $imageDir . $pk . '.jpg'; 
    } 
    else 
    {
            return 'removed.jpg';
    }
}

【讨论】:

  • 嗨,巴特,这具有完全相同的行为。
  • 你能把 C:\Program Files\EasyPHP 2.0b1\www\get_auction.php 的代码贴在第 144 行附近吗?因为这就是导致此错误的原因:第 144 行的 C:\Program Files\EasyPHP 2.0b1\www\get_auction.php
  • 第 144 行只是 $imageSrc = save_pic($PIC_URL, $pk);
【解决方案4】:

调试?

获取一个包含调试器(如 Eclipse 或 Netbeans)的 IDE,用于函数的 rtm 以查看响应方式,或进行过时的内联调试以在运行时回显代码的值。

【讨论】:

    【解决方案5】:

    在我看来,您没有发布完整的代码?

    警告消息显示getimagesize(),但在您的示例中没有使用getimagsize()。为了获得更好的帮助,我将包括整个方法或您当前工作的更新错误消息。还请包括您正在使用的 PHP 版本。

    file_get_contents() 将在出现错误时返回 false,并在 404 HTTP 错误时返回 false,如下所示:

    mfischer@testing01:~$ php -r 'var_dump(file_get_contents("http://stackoverflow.com/i_do_not_exist.jpg"));'
    
    Warning: file_get_contents(http://stackoverflow.com/i_do_not_exist.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
     in Command line code on line 1
    
    Call Stack:
        0.0002      51884   1. {main}() Command line code:0
        0.0002      51952   2. file_get_contents() Command line code:1
    
    bool(false)
    mfischer@testing01:~$ php -v
    PHP 5.2.6-5 with Suhosin-Patch 0.9.6.2 (cli) (built: Oct  5 2008 13:07:13)
    

    在这里试用你的代码对我来说非常好:

    $ cat test.php
    <?php
    $PIC_URL="http://stackoverflow.com/i_dont_exist.jpg";
    $pk = "test";
    $imageSrc = save_pic($PIC_URL, $pk);
    var_dump($imageSrc);
    
    function save_pic($pic_url, $pk) {
        $imageDir = './';
        if (!strlen($pic_url))
                return "removed.jpg";
        if (!is_dir($imageDir) || !is_writable($imageDir)) {
            return "removed.jpg";
        }
        $image = file_get_contents($pic_url);
        if (empty($image)) {
            return "removed.jpg";
        }
        $r = file_put_contents($imageDir.$pk.".jpg", $image);
        if ($r) {
                return "./$pk.jpg";
        } else {
                return "removed.jpg";
        }
    }
    $ php test.php
    
    Warning: file_get_contents(http://stackoverflow.com/i_dont_exist.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
     in /home/mfischer/tmp/532480/test.php on line 14
    
    Call Stack:
        0.0005      59824   1. {main}() /home/mfischer/tmp/532480/test.php:0
        0.0005      60176   2. save_pic() /home/mfischer/tmp/532480/test.php:4
        0.0006      60444   3. file_get_contents() /home/mfischer/tmp/532480/test.php:14
    
    string(11) "removed.jpg"
    

    PHP 函数有一个坏习惯,就是在代码中直接溢出警告消息,如果您不喜欢这样,您可以按照之前的建议使用“@”操作使它们静音,或者您也可以使用 HTTP 客户端库作为由 PEAR_HTTP 或 Zend_HTTP_Client 提供,以便更好地控制错误处理。也可以使用套接字、fsockopen 等滚动您自己的东西。

    但回到正题:如果它仍然不起作用,我认为缺少一些信息。

    【讨论】:

    • 我已更新我的问题以显示 ImageResize 函数。然而,问题似乎与 404 错误有关。
    【解决方案6】:

    您不应该测试 file_get_contents 错误吗?我的意思是像

    if( false == ($image = file_get_contents($pic_url))){
            return "removed.jpg";
        }
    

    【讨论】:

      【解决方案7】:
      • 将 HTTP HEAD 发送到给定的 URL
      • 检查返回码 == 200(文件在那里),否则会被删除
      • 检查 Content-Type 标头是否为 image/*(例如 image/png),否则会被删除
      • 如果服务器发送了 Content-Length 标头,则将其读取到变量中
      • file_get_contents(URL)
      • 如果服务器发送了该 Content-Length,请查看大小是否匹配,否则将其删除
      • 保存图片
      • 尝试 getimagesize(),如果出错则通过 unlink() 将其删除,否则将其删除
      • 成功了!

      【讨论】:

        【解决方案8】:

        您遇到了路径问题。您应该将图片的完整路径存储在定义中。

        确保该文件来自 save_pic 函数。

        DEFINE("RemovedPicUrl", "http://" . $_SERVER['SERVER_NAME'] . "/path/to/removed/image/removed.jpg")
        

        然后改变所有出现的

        "Removed.jpg"
        

        RemovedPicUrl
        

        我赌一美元可以解决你的问题。

        【讨论】:

          【解决方案9】:

          问题不是代码问题,而是由文件损坏引起的。这是在其他机器上测试时确定的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多