Determine se o arquivo enviado é imagem (qualquer formato) no MVC

Então estou usando este código para ver:

     

Isso para o modelo:

 [HttpPost] public ActionResult Index(HttpPostedFileBase file) { if (file.ContentLength > 0) { var fileName = Path.GetFileName(file.FileName); var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); file.SaveAs(path); } return RedirectToAction("Index"); } 

Funciona muito bem, a menos que o usuário adicione um arquivo que não seja uma imagem. Como posso garantir que o arquivo enviado é uma imagem. obrigado

Caso isso possa ajudar alguém, Aqui está um método estático para HttpPostedFileBase que verifica se um determinado arquivo enviado é uma imagem:

 public static class HttpPostedFileBaseExtensions { public const int ImageMinimumBytes = 512; public static bool IsImage(this HttpPostedFileBase postedFile) { //------------------------------------------- // Check the image mime types //------------------------------------------- if (postedFile.ContentType.ToLower() != "image/jpg" && postedFile.ContentType.ToLower() != "image/jpeg" && postedFile.ContentType.ToLower() != "image/pjpeg" && postedFile.ContentType.ToLower() != "image/gif" && postedFile.ContentType.ToLower() != "image/x-png" && postedFile.ContentType.ToLower() != "image/png") { return false; } //------------------------------------------- // Check the image extension //------------------------------------------- if (Path.GetExtension(postedFile.FileName).ToLower() != ".jpg" && Path.GetExtension(postedFile.FileName).ToLower() != ".png" && Path.GetExtension(postedFile.FileName).ToLower() != ".gif" && Path.GetExtension(postedFile.FileName).ToLower() != ".jpeg") { return false; } //------------------------------------------- // Attempt to read the file and check the first bytes //------------------------------------------- try { if (!postedFile.InputStream.CanRead) { return false; } //------------------------------------------ //check whether the image size exceeding the limit or not //------------------------------------------ if (postedFile.ContentLength > ImageMinimumBytes) { return false; } byte[] buffer = new byte[ImageMinimumBytes]; postedFile.InputStream.Read(buffer, 0, ImageMinimumBytes); string content = System.Text.Encoding.UTF8.GetString(buffer); if (Regex.IsMatch(content, @" 

Edit 10/02/2017: De acordo com uma edição sugerida, adicionamos uma instrução finally para redefinir o stream, para que possamos usá-lo mais tarde.

Não tenha o compilador à mão, mas algo assim deveria fazer:

 try { var bitmap = Bitmap.FromStream( file.InputStream ); // valid image stream } catch { // not an image } 

Use na class auxiliar estática:

 public static bool IsImage(HttpPostedFileBase postedFile) { try { using (var bitmap = new System.Drawing.Bitmap(postedFile.InputStream)) { return !bitmap.Size.IsEmpty; } } catch (Exception) { return false; } } } 

Use no viewmodel ASP.NET MVC:

 public class UploadFileViewModel { public HttpPostedFileBase postedFile { get; set; } public bool IsImage() { try { using (var bitmap = new System.Drawing.Bitmap(this.postedFile.InputStream)) { return !bitmap.Size.IsEmpty; } } catch (Exception) { return false; } } } } 

Este exemplo verifica se a imagem é uma imagem real e você pode modificá-la e convertê-la.

Ele come memory como um exemplo de V8 de seis litros, por isso deve ser usado quando você realmente quer saber o que esta imagem.

Para quem se depara com isso.

Você também pode usar um file.ContentType.Contains("image") para verificar se o tipo de conteúdo é de image / *.

 if(file.ContentLength > 0 && file.ContentType.Contains("image")) { //valid image } else { //not a valid image } 

Não tenho certeza se essa é uma prática recomendada, mas funciona para mim.

É 2018 e a resposta aceita não funciona com o .NET CORE 2.1 porque agora temos IFormFile vez de HttpPostedFileBase .

Aí vem a adaptação da resposta aceita para o .NET CORE 2.1 (eu também consertei o bug / typo mencionado por TomSelleck em seu comentário para a resposta aceita):

 public static class FormFileExtensions { public const int ImageMinimumBytes = 512; public static bool IsImage(this IFormFile postedFile) { //------------------------------------------- // Check the image mime types //------------------------------------------- if (postedFile.ContentType.ToLower() != "image/jpg" && postedFile.ContentType.ToLower() != "image/jpeg" && postedFile.ContentType.ToLower() != "image/pjpeg" && postedFile.ContentType.ToLower() != "image/gif" && postedFile.ContentType.ToLower() != "image/x-png" && postedFile.ContentType.ToLower() != "image/png") { return false; } //------------------------------------------- // Check the image extension //------------------------------------------- if (Path.GetExtension(postedFile.FileName).ToLower() != ".jpg" && Path.GetExtension(postedFile.FileName).ToLower() != ".png" && Path.GetExtension(postedFile.FileName).ToLower() != ".gif" && Path.GetExtension(postedFile.FileName).ToLower() != ".jpeg") { return false; } //------------------------------------------- // Attempt to read the file and check the first bytes //------------------------------------------- try { if (!postedFile.OpenReadStream().CanRead) { return false; } //------------------------------------------ //check whether the image size exceeding the limit or not //------------------------------------------ if (postedFile.Length < ImageMinimumBytes) { return false; } byte[] buffer = new byte[ImageMinimumBytes]; postedFile.OpenReadStream().Read(buffer, 0, ImageMinimumBytes); string content = System.Text.Encoding.UTF8.GetString(buffer); if (Regex.IsMatch(content, @" 

Implementação de maneira muito mais limpa,

 public static class FileExtensions { private static readonly IDictionary ImageMimeDictionary = new Dictionary { { ".bmp", "image/bmp" }, { ".dib", "image/bmp" }, { ".gif", "image/gif" }, { ".svg", "image/svg+xml" }, { ".jpe", "image/jpeg" }, { ".jpeg", "image/jpeg" }, { ".jpg", "image/jpeg" }, { ".png", "image/png" }, { ".pnz", "image/png" } }; public static bool IsImage(this string file) { if (string.IsNullOrEmpty(file)) { throw new ArgumentNullException(nameof(file)); } var extension = Path.GetExtension(file); return ImageMimeDictionary.ContainsKey(extension.ToLower()); } } 

Como primeiro passo, você deve formar uma lista branca em torno dos tipos MIME aceitáveis ​​em relação à propriedade ContentType .

no lado do servidor comparar com o tipo de conteúdo, se a sua correspondência com o seu formato enviado necessário, em seguida, continuar ou então retornar a mensagem de erro