php函数在保存图像时捕获错误的问题

时间:2009-02-10 14:12:12

标签: php

我有一种方法来保存图像,这意味着优雅地处理错误,在发生故障时将$ 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

在任何情况下,return.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()));

}

}

9 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

 $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)返回的内容,这可能有助于解决您的问题。

答案 2 :(得分:0)

试试这个:

<?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';
    }
}

答案 3 :(得分:0)

调试?

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

答案 4 :(得分:0)

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

警告消息显示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 Client库作为由PEAR_HTTP或Zend_HTTP_Client提供,以更好地控制错误处理。用套接字,fsockopen等滚动自己的东西也是可能的。

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

  • 将HTTP HEAD发送到指定的网址
  • 检查returncode == 200(文件在那里),否则它已被删除
  • 检查Content-Type标题是image / *(例如image / png),否则将其删除
  • 如果服务器发送了Content-Length标头,请将其读取到变量
  • 的file_get_contents(URL)
  • 如果服务器发送了Content-Length,请查看大小是否匹配,否则将其删除
  • 保存图片
  • 尝试使用getimagesize(),如果出现错误,请通过unlink()将其删除,然后将其删除,另外保留
  • 成功!

答案 7 :(得分:0)

您遇到路径问题。您应该在定义中存储pic的完整路径。

确保此文件来自save_pic函数。

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

然后改变所有出现的

"Removed.jpg"

RemovedPicUrl

我敢打赌你能用一美元解决你的问题。

答案 8 :(得分:0)

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