2012-05-19 23 views
10

¿Puedo verificar si un determinado archivo es una imagen o no? ¿Cómo se puede hacer esto en PHP?¿Cómo puedo comprobar si un archivo es una imagen o no?

Si el archivo no es una imagen, quiero dar un mensaje de alerta.

+1

muchas preguntas similares ya pidió en SO ... Por favor, intente buscar –

+0

@MitchWheat: i búsqueda pero no puedo encontrar adecuadamente cómo comprobar y poner en práctica. – pratik

+0

¿navegas e importas un archivo o lo lees directamente desde una fuente en particular? – sree

Respuesta

1

en PHP que puede hacerlo como siguiente manera

if ((($_FILES['profile_picture']['type'] == 'image/gif') || ($_FILES['profile_picture']['type'] == 'image/jpeg') || ($_FILES['profile_picture']['type'] == 'image/png'))) 

en Javascript Puede hacerlo como siguiente manera

function checkFile() { 
    var filename = document.getElementById("upload_file").value; 
    var ext = getExt(filename); 
// alert(filename.files[0].filesize); 
    // alert(ext); 
    if(ext == "gif" || ext == "jpg" || ext=="png") 
     return true; 
    alert("Please upload .gif, .jpg and .png files only."); 
    document.getElementById("upload_file").value=''; 
    return false; 
} 

function getExt(filename) { 
    var dot_pos = filename.lastIndexOf("."); 
    if(dot_pos == -1) 
     return ""; 
    return filename.substr(dot_pos+1).toLowerCase(); 
} 
+1

Estoy seguro de que necesita comprobar si el archivo no se acaba de renombrar sheet.pdf a sheet.jpg. Entiendes lo que quiero decir. –

+0

sí, buen punto – mack

+0

Voy a eliminar mi voto downvote. Lo siento de todos modos;) –

5

Además de getimagesize(), puede utilizar exif_imagetype()

exif_imagetype() lee los primeros bytes de una imagen y comprueba su firma.

Cuando se encuentra una firma correcta, se devolverá el valor constante apropiado, de lo contrario, el valor de retorno será FALSO. El valor de retorno es el mismo valor que getimagesize() devuelve en el índice 2, pero exif_imagetype() es mucho más rápido.

Para ambas funciones, se devuelve FALSE si no se determina que el archivo es una imagen.

+0

-1 - Ambas funciones arrojan errores de lectura, al menos en 5.3. – MikeSchinkel

+0

@MikeSchinkel Por favor, aclare. –

+0

Por ejemplo [aquí] (http://stackoverflow.com/questions/1363876/handle-error-when-getimagesget-cant-find-file) y [aquí] (http://stackoverflow.com/questions/10175758/ getimagesize-read-error). En mi caso, estaba obteniendo '' .'', ''..' 'y'' .DS_Store'' que es razonable para mí filtrar.Pero no puede detectar el error de lectura, por lo que debe asegurarse de que nunca se produzca comprobando todo lo que pueda causar un problema _ (el archivo existe, los permisos correctos, ¿otro?) _ De antemano. – MikeSchinkel

0

Me gustaría hacer esto para averiguar ...

$type =array('jpg','gif'); 

foreach($type as $val){ 

if($_FILES['filename']['type'] == 'image/$val') 
{ 
echo "its an image file"; 
} 
else{ 
echo "invalid image file" 
} 
+0

No es seguro. Puedo guardar un exe como 'image/jpeg', por ejemplo .. –

+0

estoy de acuerdo, pero este es uno de los enfoques ... – sree

+0

¿por qué votar? todavía puede validar ... – sree

0

manera mejor y más rápida es utilizar exif_imagetype(). Algo así como que debe hacer el trabajo:

$valid_formats = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); 
$file_format = exif_imagetype($filename); 

if(!in_array($file_format, $valid_formats)) 
    echo("File format is not valid"); 
Cuestiones relacionadas