2010-11-19 17 views
15

Tengo el siguiente:jQuery - INPUT type = File, Image FileType Validation options?

<input id="user_profile_pic" name="user[profile_pic]" type="file"> 

En el servidor puedo comprobar para asegurarse de que es una imagen, pero quiero comprobar en la primera del lado del cliente.

¿Cómo con jQuery puedo alertar al usuario si el archivo de entrada seleccionado no es un gif, jpg, png o bmp?

Gracias

Respuesta

26

desea comprobar cuál es el valor del elemento es, algo a lo largo de las líneas de:

$("#user_profile_pic").change(function() { 

    var val = $(this).val(); 

    switch(val.substring(val.lastIndexOf('.') + 1).toLowerCase()){ 
     case 'gif': case 'jpg': case 'png': 
      alert("an image"); 
      break; 
     default: 
      $(this).val(''); 
      // error message here 
      alert("not an image"); 
      break; 
    } 
}); 

Editar

código modificado basado en el comentario - ahora elimina el valor del archivo seleccionado si no es una imagen

+0

TypeError no detectado: Objeto # no tiene el método 'onchange' – AnApprentice

+0

.change funciona. Pero aún no es bueno, ya que mientras falla, aún selecciona y muestra el archivo en la página. – AnApprentice

+0

Agregando esto trabajado, ".val ('');" pero no sé cuán obediente es ... ¿alguien? – AnApprentice

7

Se podría utilizar una expresión regular:

var val = $("#user_profile_pic").val(); 
if (!val.match(/(?:gif|jpg|png|bmp)$/)) { 
    // inputted file path is not an image of one of the above types 
    alert("inputted file path is not an image!"); 
} 

Por supuesto que podría añadir más formatos de la expresión regular. Hay formas más complejas y completas de lograr esto, pero este método realizará la tarea siempre que la ruta del archivo de imagen ingresada finalice en una extensión de archivo de imagen estándar.

+0

¿Qué pasa si hay tres archivos de entrada y quiero validar uno por uno? 'var val1 = ...', 'var val2 = ...' 'var val3 = ...' 'if (! val.match (/ (?: gif | jpg | png | bmp) $ /)) { ' – alisa

1

Puede haber navegadores que le permiten crear un <img/> de la ruta determinada, con el que puede comprobar si se trata de una imagen real o no (si no el onerror-event debe activarse en la imagen y tendrá un ancho/altura de 0).

Pero como esto solo funciona en algunos navegadores y supone un riesgo para la seguridad (en mi opinión), no recomendaría hacer esto, por lo que mi respuesta es: no se puede validar allí.

Comprobar las extensiones de archivo como sugiere Alex puede ser una opción, pero la extensión de archivo no garantiza si se trata de una imagen. Sin embargo, como una simple verificación previa (no validación) podría ser útil.

9

Es bastante simple, no es necesaria ninguna validación de JavaScript. Simplemente escriba esto y solo aceptará archivos de imagen.

<input type="file" multiple accept='image/*'> 
+2

¡es genial, pero no funciona como validación! es solo para un manejo más fácil seleccionar una imagen de una carpeta con diferente extensión. como se puede ver aquí -> http://imageshack.us/a/img20/8451/switchzz.jpg – bernte

+0

Uno que lo define en el HTML puede ser anulado en algunos navegadores seleccionando "todos los archivos" en el cuadro de diálogo del archivo. Dos, a pesar de que en sí mismo no es 100% infalible, validarlo con javascript es otro elemento de disuasión añadido en la lucha contra actividades maliciosas. En general, desea que su back-end valide antes de aceptarlo, y como una ventaja adicional al verificar y validar los primeros bytes del archivo para validarlo, es un tipo que realmente desea, ya que solo por extensión nunca es un medio infalible. – chris

1

¿Cómo podemos comprobar, que el usuario selecciona archivo de imagen?

  • Por validación extensión de archivo
    Es un trabajo como se esperaba, archivo de texto con la extensión .png pasar aquí
  • input[type=file][accept=image/*] Inicialmente esconde non-image archivos de usuario. Pero este filtro funciona por extensiones también. Y el usuario aún puede ingresar manualmente cualquier nombre de archivo existente.
  • Podemos verificar el tipo mímico del resultado dataUrl, comienza con data:mimetype;base64,.... Entonces, necesitamos el tipo mimet image/*.

    var file = $('#uploadfile'); 
    file.on('change', function (e) { 
        var reader = new FileReader(); 
    
        reader.onload = function() { 
         var data = reader.result; 
         if (data.match(/^data:image\//)) { 
          $('#thumbnail').attr('src', data); 
         } else { 
          console.error('Not an image'); 
         } 
        }; 
    
        reader.readAsDataURL(file.prop('files')[0]); 
    }); 
    
Cuestiones relacionadas