2011-04-08 14 views
6

Estoy intentando cargar una imagen desde un sitio externo sobre el que no tengo control.PHP imagecreatefromstring(): gd-jpeg, libjpeg: error recuperable

La mayoría de las veces funciona bien (cientos de imágenes probadas hasta el momento).

Es ahora me da este error para una imagen en particular:

imagecreatefromstring(): gd-jpeg, libjpeg: error recuperable: corromper los datos JPEG: final prematuro del segmento de datos

de esta línea :

$im = @imagecreatefromstring($imageString); 

El consejo que había leído hasta el momento sugiere que se añada:

ini_set("gd.jpeg_ignore_warning", true); 

pero eso no ha tenido ningún efecto y sigo recibiendo el error. Estoy haciendo el ini_set justo antes de la llamada. ¿Es eso relevante?

Estoy realmente atascado en cómo ignorar este error y continuar.

+1

¿Tiene permiso para establecer este parámetro ini? ¿Y esta advertencia está causando que la secuencia de comandos finalice? – SimonDowdles

+0

BTW, ¿solo desea mostrar esta imagen, o realmente desea copiarla a su servidor? – SimonDowdles

+0

No recibo ninguna advertencia sobre la configuración del archivo INI, sigue siendo un error fatal en la función gdcreate. – Dave

Respuesta

6

El problema se debió a mi manejo de errores. Configuraría un controlador de errores para que mi llamada a

$im = @imagecreatefromstring($imageString); 

no estaba suprimiendo los errores.

Mediante la modificación de mi gestor de errores con:

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

ahora puedo suprimir errores correctamente seleccionados.

he encontrado la información aquí: http://anvilstudios.co.za/blog/php/how-to-ignore-errors-in-a-custom-php-error-handler/

+0

He estado golpeando mi cabeza contra la pared años sobre estos errores, y la incapacidad de suprimirlos con @, nunca pensé que sería nuestro controlador de error personalizado el culpable, ¡así que gracias por publicar ese enlace y respuesta! – oucil

0

Si se acaba de mostrar la imagen, entonces le sugiero simplemente leer el contenido y mostrar la imagen de la siguiente manera:

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

Si estás interesado en copiar la imagen a su servidor, usted tiene algunas opciones , dos de los cuales son la función copy() o el método utilizado anteriormente y después fwrite():

Opción 1 - la función copy(), disponible de PHP 4

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

Opción 2 - Uso file_get_contents() y 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 

espero que encuentre algún uso en el anterior

+0

Si termina utilizando el método 'file_get_contents()' junto con 'fwrite()', debe implementar sus propias extensiones comprobando en el archivo remoto. Si usa 'file_get_contents()' para mostrar solo la imagen, debe validar las extensiones de imagen y aplicar el tipo de contenido relativo a su encabezado. – SimonDowdles

0

Teniendo en cuenta que usted quiere hacer una imagen en miniatura y guardarlo, se podría aplicar un práctico cambiar el tamaño de la función como la siguiente:

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

Luego, después de haber copiado t que el archivo a su servidor usando uno de mis métodos en mi respuesta anterior esto, se podía aplicar simplemente la función de la siguiente manera:

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

Esta función me sirve bastante bien. Lo aplico a miles de imágenes al día y funciona como un encanto.

+0

código es un poco defectuoso - corrigió un par de errores en una copia local antes de pasar a otra cosa - parece una función útil simplemente no es la mejor para copiar/pegar/probar – Alvin

2

esto se puede resolver con:

ini_set ('gd.jpeg_ignore_warning', 1); 
Cuestiones relacionadas