vista una net mvc multiples modelos modelo insertar imagen guardar desde datos controlador consultar cargar asp almacenar c# asp.net-mvc-3 file-upload httppostedfilebase

c# - net - MVC3 Cómo verificar si HttpPostedFileBase es una imagen



multiples modelos en una vista mvc (3)

O puede verificarlo en el lado del cliente a través del atributo html ''aceptar'' para filtrar el archivo lo antes posible:

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

esto solo mostrará los tipos de archivos definidos en su atributo de aceptación como predeterminado. Cuidado, el usuario todavía puede cambiar el archivo a "Todos los archivos", con esto en mente, mejor revisa esto:

Se resolvió el problema , un fragmento de código javascript para verificar la extensión, y luego hacer una edición para deshabilitar el botón como:

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

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

Tengo un controlador como este:

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

¿Cómo puedo asegurarme de que uploadFile es una imagen (jpg, png, etc.)

Lo he intentado con

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

que lanza una ArgumentException si no se puede crear bitmapImage.

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


Puede verificar el nombre y la extensión del archivo y el tipo MIME, pero eso podría no ser confiable porque el usuario simplemente podría cambiar el nombre del archivo antes de cargarlo. Aquí hay una forma confiable de lograrlo mirando el contenido del archivo: https://.com/a/6388927/29407

Por supuesto, podría extender esto a otros formatos de tipo de imagen conocidos que PNG, como este:

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


Puede verificar las HttpPostedFileBase objeto HttpPostedFileBase para esto

  • Tipo de contenido
  • Nombre de archivo (verifique las extensiones de archivo, que ya conoce :)

También aquí hay un método pequeño, que he preparado y que 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 esto here