PHP imagecreatefromstring(): GD-jpeg, libjpeg: восстанавливаемая ошибка

Я пытаюсь загрузить изображение с внешнего сайта, над которым у меня нет контроля.

большую часть времени он работает нормально (сотни снимков пока тестируется).

теперь он дает мне эту ошибку для одного конкретного изображения:

imagecreatefromstring(): GD-jpeg, libjpeg: восстанавливаемая ошибка: поврежденные данные JPEG: преждевременное завершение сегмента данных

из этой строки:

$im = @imagecreatefromstring( $imageString );

совет, который я читал до сих пор, предполагает добавление:

ini_set("gd.jpeg_ignore_warning", true);

но это не имело никакого эффекта, и я все еще получаю ошибки. Я делаю ini_set непосредственно перед вызовом. Это важно?

Я действительно застрял на том, как игнорировать эту ошибку и продолжить.

4 ответов


проблема была связана с моей обработкой ошибок. Я бы настроил обработчик ошибок, поэтому мой вызов

$im = @imagecreatefromstring( $imageString );

не подавлял ошибки.

путем изменения моего обработчика ошибок с помощью:

   if (error_reporting() === 0)
   {
        // This copes with @ being used to suppress errors
        // continue script execution, skipping standard PHP error handler
        return false;
   }

теперь я могу правильно подавлять некоторые ошибки.

Я нашел информацию здесь: http://anvilstudios.co.za/blog/php/how-to-ignore-errors-in-a-custom-php-error-handler/


Это можно решить с:

ini_set ('gd.jpeg_ignore_warning', 1);

если вы просто показываете изображение, то я предлагаю просто прочитать содержимое и отобразить изображение следующим образом:

$img = "http://path/to/image";
$contents = file_get_contents($img);
header("Content-Type: image/jpeg");
print($contents);

если вы хотите скопировать изображение на свой сервер, у вас есть несколько вариантов, два из которых являются copy() функция или метод, используемый выше, а затем fwrite():

1 - The copy() функция, доступная из PHP 4

$file1 = "http://path/to/file";
$dest = "/path/to/yourserver/lcoation";
$docopy = copy($file1, $dest);

2 - через file_get_contents() и fwrite()

$img = "http://path/to/image";
$contents = file_get_contents($img);
$newfile = "path/to/file.ext";
$fhandler = fopen($newfile, 'w+'); //create if not exists, truncate to 0 length
$write = fwrite($fhandler, $contents); //write image data
$close = fclose($fhandler); //close stream
chmod(0755, $newfile); //make publically readable if you want

Я надеюсь, что вы найдете использовать в выше


учитывая, что вы хотите сделать эскиз и сохранить его, вы можете реализовать удобную функцию изменения размера, такую как:

<?php
function resize($sourcefile, $endfile, $thumbwidth, $thumbheight, $quality){

    $ext1 = explode(".",trim($sourcefile));
    $ext = strtolower(trim(array_slice($sext1,-1)));

    switch($ext):
        case 'jpg' or 'jpeg':
            $img = imagecreatefromjpeg($sourcefile);
        break;
        case 'gif':
            $img = imagecreatefromgif($sourcefile);
        break;
        case 'png':
            $img = imagecreatefrompng($sourcefile);
        break;
    endswitch;

    $width = imagesx( $img );
    $height = imagesy( $img );

    if ($width > $height) {
        $newwidth = $thumbwidth;
        $divisor = $width / $thumbwidth;
        $newheight = floor( $height / $divisor);
    }
    else {
        $newheight = $thumbheight;
        $divisor = $height / $thumbheight;
        $newwidth = floor( $width / $divisor );
    }

    // Create a new temporary image.
    $tmpimg = imagecreatetruecolor( $newwidth, $newheight );

    // Copy and resize old image into new image.
    imagecopyresampled( $tmpimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height );

    // Save thumbnail into a file.

    switch($ext):
        case 'jpg' or 'jpeg':
            $makeimg = imagejpeg($tmpimg, $endfile, $quality);
        break;
        case 'gif':
            $makeimg = imagegif($tmpimg, $endfile, $quality);
        break;
        case 'png':
            $makeimg = imagepng($tmpimg, $endfile, $quality);
        break;
    endswitch;

    // release the memory
    imagedestroy($tmpimg);
    imagedestroy($img);

        if($makeimg){
        chmod($endfile,0755);
        return true;
        }else{
        return false;
        }
    }
?>

затем, после того, как вы скопировали файл на свой сервер, используя один из моих методов в моем ответе выше, вы можете просто применить функцию следующим образом:

$doresize = resize($sourcefile, $endfile, $thumbwidth, $thumbheight, $quality);
echo ($doresize == true ? "IT WORKED" : "IT FAILED");

эта функция служит мне очень хорошо. Я применить его к 1000 снимков в день и он работает как шарм.