2009-07-17 24 views
5

Necesito comprobar si una imagen dada es JPEG.Comprueba si la imagen es JPEG

if ($_FILES["fname"]["error"] > 0) { 
    $imgData = "hyperlink/holder.jpg"; 
} else { 
    $imgData ="hyperlink/" . $_FILES["fname"]["name"]; 
} 
// Only accept jpg images 
// pjpeg is for Internet Explorer should be jpeg 
if (!($_FILES["fname"]["type"] == "image/pjpeg")) { 
    print "I only accept jpg files!"; 
    exit(0); 
} 

Cuando va al primer enunciado en el primer enunciado if, siempre da ¡Solo acepto archivos jpg!

¿Cómo puedo repararlo?

Respuesta

3

PHP tiene un soporte de imagen tan bueno, me pregunto por qué está restringiendo su aplicación. En sólo un par de líneas de código que puede hacer frente a cualquier formato de entrada y convertir a JPEG, si eso es un requisito ...

$im = imagecreatefrompng(input_filename) 
imagejpeg($im, output_filename); 
17

Pruebe la función de imagen exif_imagetype.

Ejemplo:

if(exif_imagetype($filepath) != IMAGETYPE_JPEG){ 
    echo 'Not a JPEG image'; 
} 
0

Al utilizar $_FILES, usted está confiando en las informaciones enviadas por el cliente, que no es lo mejor que puede hacer (usted ha visto que no siempre es el mismo, y, si recuerda correctamente, $_FILES['...']['type'] puede ser falso).

Si está utilizando PHP> = 5.3 (o puede instalar paquetes PECL), tal vez pueda darle un vistazo a la extensión Fileinfo. Si está utilizando una versión anterior, ¿qué pasa con mime_content_type?

Y, como dijo Scott, ¿por qué permitir solo jpeg?

Mirando mejor el código: cuando se encuentra en el primer caso (error > 0), ¿está asignando un archivo predeterminado al $imgData? ¿Por qué los espacios alrededor de "hipervínculo"? ¿Y por qué siempre usas para verificar el content-type, incluso si hubo un error un par de líneas antes?

Para terminar, ¿echó un vistazo al manual (Handling file uploads)?

0

¿Por qué no intenta crear una serie de excepciones (los archivos que desea que el usuario pueda cargar).

// Hyperlink for your website 
$hyperlink = "http://www.yourwebsitehere.com"; 

if($_FILES['fname']['error'] > 0) 
{ 
    $image= $hyperlink . "/holder.jpg"; 
} 
else 
{ 
    $image = $hyperlink . "/" . $_FILES['fname']['name']; 
} 

// Only accept files of jpeg format 
$exceptions = array("image/jpg", "image/jpeg", "image/pjpeg"); 

foreach($exceptions as $value) 
{ 
    if($_FILES['fname']['type'] != $value) 
    { 
     echo "I only accept jpeg images!"; 
     break; // Or exit(); 
    } 
} 
+0

Ninguna asignación para '$ _FILES ['fname'] ['type']' siempre omitirá el bloque if. (es decir, un éxito) –

1

Check the mime (Multipurpose Internet Mail Extensions) tipo de archivo con este código. Y verifica tu tipo deseado. También puedes detectar png, gif con este código.

if($_FILES["fname"]["type"] == "image/jpeg") 
    { 
     echo "File type is JPEG"; 
    } 
+0

un hacker puede simular fácilmente el tipo de mimo. – hanshenrik

1

Creo que las siguientes obras:

También tenga en cuenta que:

(exif_imagetype ($ ImagePathAndName) == IMAGETYPE_JPEG)

sólo lee los primeros bytes que buscan para un encabezado de imagen, por lo que no es lo suficientemente bueno para confirmar si una imagen está dañada.

A continuación lo tengo en una declaración lógica "y", es decirestas dos pruebas se deben pasar para que la imagen de calificar como válida y etc no está dañado:

if ((exif_imagetype($ImagePathAndName) == IMAGETYPE_JPEG) && (imagecreatefromjpeg($ImagePathAndName) !== false)) 
{ 
echo 'The picture is a valid jpg<br>'; 
} 

Nota: Es necesario colocar esta línea de código en la parte superior del código PHP con el fin de evite ver los mensajes de advertencia de imagecreatefromjpeg ($ ImagePathAndName) cuando encuentra un archivo de imagen falso/dañado.

ini_set(‘gd.jpeg_ignore_warning’, 1); 
Cuestiones relacionadas