2012-08-23 18 views
6

Tengo una función de carga de archivos donde los usuarios pueden cargar archivos. Quiero restringir que los usuarios suban ciertos tipos de archivos. Los tipos permitidos son: .doc, .xlsx, .txt, .jpeg.¿Cómo restringir los tipos de archivos en FileUpload en MVC3?

¿Cómo puedo hacer esto?

Este es mi código real de carga de archivos:

 public ActionResult UploadFile(string AttachmentName, BugModel model) 
     {    
     BugModel bug = null; 
     if (Session["CaptureData"] == null) 
     { 
      bug = model; 
     } 
     else 
     { 
      bug = (BugModel)Session["CaptureData"]; 
     } 
     foreach (string inputTagName in Request.Files) 
     { 
      HttpPostedFileBase file1 = Request.Files[inputTagName]; 
      if (file1.ContentLength > 0) 
      { 
       string path = "/Content/UploadedFiles/" + Path.GetFileName(file1.FileName); 
       string savedFileName = Path.Combine(Server.MapPath("~" + path)); 
       file1.SaveAs(savedFileName); 
       BugAttachment attachment = new BugAttachment(); 
       attachment.FileName = "~" + path.ToString(); 
       attachment.AttachmentName = AttachmentName; 
       attachment.AttachmentUrl = attachment.FileName; 
       bug.ListFile.Add(attachment); 
       model = bug; 
       Session["CaptureData"] = model; 
      } 
     } 
     ModelState.Clear(); 
     return View("LoadBug", bug); 
    } 

Respuesta

19

Lo primero que debe verificar es si la extensión del archivo contenido en file1.FileName coincide con una de las extensiones permitidas. Entonces, si realmente quiere asegurarse de que el usuario no haya cambiado el nombre de algún otro tipo de archivo a una extensión permitida, tendrá que examinar el contenido del archivo para saber si es uno de los tipos permitidos.

He aquí un ejemplo de cómo comprobar si la extensión de archivo pertenece a una lista de extensiones predefinidas:

var allowedExtensions = new[] { ".doc", ".xlsx", ".txt", ".jpeg" }; 
var extension = Path.GetExtension(file1.FileName); 
if (!allowedExtensions.Contains(extension)) 
{ 
    // Not allowed 
} 
+0

@Darrin Dimitrov .... ¿cómo puedo comprobar la extensión que me puede proporcionar cualquier muestra – SoftwareNerd

+0

@Darrin Dimitrov .. .gracias está hecho y estoy mostrando los archivos cargados en la tabla antes de guardarlos en la Base de Datos ... si un usuario quiere eliminar uno de los archivos cargados, ¿cómo puedo hacer esto ... – SoftwareNerd

6

Usted puede utilizar la propiedad ContentType del HttpPostedFileBase para una comprobación básica del tipo de archivo (tipo MIME) : See MSDN's page on the Content-Type property here

Aquí es una manera de hacerlo:

private static bool IsValidContentType(string contentType) 
{ 
    string ct = contentType.ToLower(); 

    return ((ct == "application/msword") || (ct == "application/pdf") || (ct == "application/vnd.openxmlformats-officedocument.wordprocessingml.document")); 
} 

etc ..

Sin embargo, para una inspección más profunda, tendrá que inspeccionar el contenido del archivo. Es fácil cambiar una extensión de archivo ..

7
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class AllowedFileExtensionAttribute : ValidationAttribute 
{ 
    public string[] AllowedFileExtensions { get; private set; } 
    public AllowedFileExtensionAttribute(params string[] allowedFileExtensions) 
    { 
     AllowedFileExtensions = allowedFileExtensions; 
    } 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file != null) 
     { 
      if (!AllowedFileExtensions.Any(item => file.FileName.EndsWith(item, StringComparison.OrdinalIgnoreCase))) 
      { 
       return new ValidationResult(string.Format("{1} için izin verilen dosya uzantıları : {0} : {2}", string.Join(", ", AllowedFileExtensions), validationContext.DisplayName, this.ErrorMessage)); 
      } 
     } 
     return null; 
    } 
} 

Uso En el modelo

[AllowedFileExtension(".jpg", ".png", ".gif", ".jpeg")] 
    public HttpPostedFileBase KategoriResmi { get; set; } 
+2

esta es la respuesta real –

+0

Esta es la respuesta real y concisa. Gracias. –

Cuestiones relacionadas