Проблема с функцией php, чтобы поймать ошибку при сохранении изображения - PullRequest
0 голосов
/ 10 февраля 2009

У меня есть метод для сохранения изображения, который должен изящно справляться с ошибкой, устанавливая $ 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 никогда не возвращается ни при каких обстоятельствах.

редактировать: добавлено изображениеРазмер кода:

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 голосов
/ 27 февраля 2009

У вас проблемы с путями. Вы должны сохранить полный путь к картинке в определении.

Убедитесь, что этот файл получен из функции save_pic.

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

затем измените все вхождения

"Removed.jpg"

до

RemovedPicUrl

И я поставлю вам доллар, который исправит вашу проблему.

0 голосов
/ 28 февраля 2009

Проблема была не в коде, а в повреждении файла. Это было определено при тестировании на других машинах.

0 голосов
/ 26 февраля 2009

Если вы не проверяете ошибки file_get_contents? Я имею в виду что-то вроде

if( false == ($image = file_get_contents($pic_url))){
        return "removed.jpg";
    }
0 голосов
/ 27 февраля 2009
  • Отправить HTTP HEAD по указанному URL
  • Проверьте код возврата == 200 (файл есть), иначе он удален
  • Убедитесь, что заголовок Content-Type является image / * (например, image / png), иначе он удален
  • Если сервер отправил заголовок Content-Length, прочитайте его в переменную
  • file_get_contents (URL)
  • Если сервер отправил эту Content-Length, посмотрите, совпадает ли размер, иначе он будет удален
  • Сохранить изображение
  • Попробуйте getimagesize (), если он дает ошибки, удалите его с помощью unlink (), и он будет удален, иначе сохраните его
  • Успех!
0 голосов
/ 24 февраля 2009

Мне кажется, вы не публикуете свой полный код?

Предупреждающее сообщение гласит getimagesize(), но нигде в вашем примере не используется getimagsize(). Чтобы получить лучшую помощь, я бы включил весь метод или обновленное сообщение об ошибке ваших текущих усилий. Пожалуйста, включите также версию PHP, которую вы используете.

file_get_contents() вернет false в случае ошибок и сделает это при 404 ошибках HTTP, как показано:

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 и т. Д.

Но вернемся к делу: если он все еще не работает, я думаю, что какая-то информация отсутствует.

0 голосов
/ 23 февраля 2009

Debug

Получите IDE, которая включает в себя отладчик, например Eclipse или Netbeans, rtm для функций, чтобы увидеть, как реагировать, или отлаженную встроенную отладку для отображения значения кода во время выполнения.

0 голосов
/ 23 февраля 2009

Попробуйте это:

<?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';
    }
}
0 голосов
/ 10 февраля 2009
 $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), это может помочь решить вашу проблему.

0 голосов
/ 10 февраля 2009

Вы уверены, что пишете в корневую папку? Потому что я не вижу никаких проблем с вашим кодом. file_get_contents и file_put_contents, похоже, не работают, поэтому ваше изображение где-то записывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...