Comment valider type de fichier de HttpPostedFileBase attribut dans Asp.Net MVC 4?
Je suis en train de valider un type de fichier de HttpPostedFileBase
attribut de vérifier le type de fichier mais je ne peux pas le faire parce que la validation est de passage. Comment pourrais-je faire cela ?
essayer
Modèle
public class EmpresaModel{
[Required(ErrorMessage="Choose a file .JPG, .JPEG or .PNG file")]
[ValidateFile(ErrorMessage = "Please select a .JPG, .JPEG or .PNG file")]
public HttpPostedFileBase imagem { get; set; }
}
HTML
<div class="form-group">
<label for="@Html.IdFor(model => model.imagem)" class="cols-sm-2 control-label">Escolha a imagem <img src="~/Imagens/required.png" height="6" width="6"></label>
@Html.TextBoxFor(model => Model.imagem, new { Class = "form-control", placeholder = "Informe a imagem", type = "file" })
@Html.ValidationMessageFor(model => Model.imagem)
</div>
ValidateFileAttribute
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Web;
//validate file if a valid image
public class ValidateFileAttribute : RequiredAttribute{
public override bool IsValid(object value)
{
bool isValid = false;
var file = value as HttpPostedFileBase;
if (file == null || file.ContentLength > 1 * 1024 * 1024)
{
return isValid;
}
if (IsFileTypeValid(file))
{
isValid = true;
}
return isValid;
}
private bool IsFileTypeValid(HttpPostedFileBase file)
{
bool isValid = false;
try
{
using (var img = Image.FromStream(file.InputStream))
{
if (IsOneOfValidFormats(img.RawFormat))
{
isValid = true;
}
}
}
catch
{
//Image is invalid
}
return isValid;
}
private bool IsOneOfValidFormats(ImageFormat rawFormat)
{
List<ImageFormat> formats = getValidFormats();
foreach (ImageFormat format in formats)
{
if(rawFormat.Equals(format))
{
return true;
}
}
return false;
}
private List<ImageFormat> getValidFormats()
{
List<ImageFormat> formats = new List<ImageFormat>();
formats.Add(ImageFormat.Png);
formats.Add(ImageFormat.Jpeg);
//add types here
return formats;
}
}
- Votre
ValidateFileAttribute
ne doit pas hériter deRequiredAttribute
, et vous aussi ne sera pas obtenir la validation côté client. Vous avez besoin pour créer vous-même la validation de l'attribut qui hérite deValidationAttribute
et met en œuvreIClientValidatable
. - comment pourrais-je faire cela ? avez-vous un exemple ?
- Mais il est un peu pas clair ce que vous souhaitez valider votre
file.ContentLength > 1 * 1024 * 1024
suggèrent que vous voulez une taille maximale de fichier (type de fichier et la taille du fichier de validation sont 2 choses distinctes et doivent être séparer les 2 attributs)
Vous devez vous connecter pour publier un commentaire.
Parce que votre attribut hérite de l'attribut existant, il devra être enregistrée dans
global.asax
(voir cette réponse pour un exemple), cependant ne pas faire dans votre cas. Votre code de validation ne fonctionne pas, et un fichier de type attribut ne doit pas être héritant deRequiredAttribute
- il doit hériter deValidationAttribute
et si vous voulez la validation côté client, et il doit aussi mettre en œuvreIClientValidatable
. Un attribut de valider les types de fichiers serait (notez que ce code si pour une propriété qui estIEnumerable<HttpPostedFileBase>
et valide chaque fichier dans la collection)Il serait appliqué à une propriété comme
et dans la vue
Les scripts suivants sont alors requis pour la validation côté client (en collaboration avec
jquery.validate.js
etjquery.validate.unobtrusive.js
Notez que vous code tente aussi de valider la taille maximale du fichier qui doit être séparé de la validation de l'attribut. Pour un exemple d'attribut de validation qui valide la taille maximale autorisée, reportez-vous cet article.
En outre, je recommande Le Guide Complet De Validation ASP.NET MVC 3 - Partie 2 comme un bon guide pour créer des attributs de validation
javascript $.validator.addMethod("filetype", function (value, element, param) { for (var i = 0; i < element.files.length; i++) { var extension = getFileExtension(element.files[0].name); if ($.inArray(extension, param.validtypes) === -1) { return false; } } return true; });
devrait être un élément.files[i].nom