2012-08-25 24 views
18

Tengo un controlador de la siguiente manera:MVC3 ¿Cómo comprobar si HttpPostedFileBase es una imagen

public ActionResult Upload (int id, HttpPostedFileBase uploadFile) 
{ 
.... 
} 

¿Cómo puedo hacer para asegurar que uploadfile es una imagen (jpg, gif, etc.)

He tratado con

using (var bitmapImage = new Bitmap (uploadFile.InputStream)) {..} 

que arroja una excepción ArgumentException si no se puede crear la imagen de mapa de bits.

¿Hay una mejor manera, por ejemplo, mirando uploadFile.FileName?

Respuesta

55

Usted puede comprobar las propiedades del objeto HttpPostedFileBase para este

  • ContentType
  • nombre de archivo (comprobar las extensiones de archivo, que ya sabemos acerca :))

enter image description here

también he aquí un pequeño método, he preparado y puede usar/extender ...

private bool IsImage(HttpPostedFileBase file) 
{ 
    if (file.ContentType.Contains("image")) 
    { 
     return true; 
    } 

    string[] formats = new string[] { ".jpg", ".png", ".gif", ".jpeg" }; // add more if u like... 

    // linq from Henrik Stenbæk 
    return formats.Any(item => file.FileName.EndsWith(item, StringComparison.OrdinalIgnoreCase)); 
} 

También he escrito un artículo sobre este here

+0

Thaks - He cambiado el foreach a: 'return formats.Any (item => file.FileName.EndsWith (item, StringComparison.OrdinalIgnoreCase));' –

16

Se puede comprobar el nombre de archivo y la extensión y el tipo MIME, pero que podría no ser fiable debido a que el usuario podría simplemente cambiar el nombre del archivo antes de subirlo. He aquí una forma fiable de conseguir que al mirar los contenidos del archivo: https://stackoverflow.com/a/6388927/29407

Se podría, por supuesto extender esto a otros formatos conocidos de tipo de imagen que PNG, así:

public class ValidateFileAttribute : RequiredAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file == null) 
     { 
      return false; 
     } 

     if (file.ContentLength > 1 * 1024 * 1024) 
     { 
      return false; 
     } 

     try 
     { 
      var allowedFormats = new[] 
      { 
       ImageFormat.Jpeg, 
       ImageFormat.Png, 
       ImageFormat.Gif, 
       ImageFormat.Bmp 
      }; 

      using (var img = Image.FromStream(file.InputStream)) 
      { 
       return allowedFormats.Contains(img.RawFormat); 
      } 
     } 
     catch { } 
     return false; 
    } 
} 
+1

Creo que trayendo el código de ejemplo, probablemente debería eliminó la limitación deseada en la otra publicación de 'no exceder 1 MB' al eliminar la 2ª afirmación if, no ayuda a responder esta pregunta. –

3

O usted puede comprobar en el lado del cliente a través de atributos html 'aceptar' para filtrar el archivo antes posible:

@Html.TextBoxFor(x => x.HomeDeviceImage, new { @type = "file", @accept = "image/x-png, image/gif, image/jpeg" }) 

esto sólo mostrará tipos de archivos definidos en el atributo aceptar como predeterminado. Ten cuidado, el usuario todavía puede cambiar filetye a "Todos los archivos", con esto en mente, mejor comprobar esto:

Solved concern , un fragmento de código JavaScript para comprobar la extensión, y luego hacer un poco de edición para desactivar botón:

  $('input:submit').attr('disabled', true); 

hasta que la extensión del archivo sea correcta. sin embargo, lo he comprobado en el lado del servidor. :)

Cuestiones relacionadas