Feltöltött fájl validálása ASP.NET MVC-ben

Az ASP.NET MVC egyik szépségét a kód tisztasága adja, ami részben a model validálásnak köszönhető. Az ember fogja a System.ComponentModel.DataAnnotations névtérben lévő attribútumokat, teleaggatja velük a modellt vagy a view-modelt, és máris működik a validálás, ráadásul a kód egyéb részeit sem zavarja össze.

Mindez szép és jó, ha egy string értékét vagy hasonlóan egyszerű inputot szeretnénk vizsgálni, de például egy feltöltött fájl ellenőrzésére nem sok lehetőségünk van. .NET 4.5-től kezdve ugyan már van FileExtensionAttribute, de gyakran ennél többre van szükségünk.

Amire szinte mindig szükség van:

  • Töltött-e fel fájlt a felhasználó?
  • A feltöltött fájl kiterjesztése megfelel-e?
  • A feltöltött fájl mérete a meghatározott maximumon belül van-e?

De lehet néhány extrább igény is:

Készítsünk magunknak saját attribútumot! Arra kell csak figyelnünk, hogy a ValidationAttribute ősosztályból származzon, és hogy a feltöltésnél használatos HttpPostedFileBase típusú változókat validáljuk vele.

Íme egy megoldás:

[AttributeUsage( AttributeTargets.Property )]
public sealed class AttachmentAttribute : ValidationAttribute
{
  protected override ValidationResult IsValid( object value, 
ValidationContext validationContext ) { HttpPostedFileBase file = value as HttpPostedFileBase; // A fájl kötelező. if( file == null ) { return new ValidationResult( "Tölts fel fájlt!" ); } // A fájl max. 10MB-os lehet. if( file.ContentLength > 10 * 1024 * 1024 ) { return new ValidationResult( "A fájl túl nagy!" ); } // A fájl csak PDF lehet. string ext = Path.GetExtension( file.FileName ); if( String.IsNullOrEmpty( ext ) || !ext.Equals( ".pdf", StringComparison.OrdinalIgnoreCase ) ) { return new ValidationResult( "A fájl nem PDF!" ); } // Minden rendben. return ValidationResult.Success; } }

Ha ezzel megvagyunk, akkor már csak rá kell aggatnunk az [Attachment] attribútumot a modell megfelelő tulajdonságára, és a hibák máris be fognak kerülni a ModelState-be.

Ha a webalkalmazásunkban több helyen, többféle fájlt is fel lehet tölteni, akkor bevezethetünk rájuk egy enumot, amit átadunk az AttachmentAttribute konstruktorának. Így minden fájl ellenőrzése egy helyen, központosítva történhet.

 

Technorati-címkék: ,,
Advertisements

2 thoughts on “Feltöltött fájl validálása ASP.NET MVC-ben

  1. Pingback: Ajaxos fájl feltöltés | Balássy György szakmai blogja

  2. Pingback: Ajaxos fájl feltöltés - Balássy György szakmai blogja - devPortal

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s