2012-08-23 13 views
6

Ich habe eine Dateiupload-Funktion, wo Benutzer Dateien hochladen können. Ich möchte die Benutzer vom Hochladen bestimmter Dateitypen einschränken. Die zulässigen Typen sind: .doc, .xlsx, .txt, .jpeg.Wie schränkt man die Dateitypen in FileUpload in MVC3 ein?

Wie kann ich das tun?

Dies ist mein eigentlicher Datei-Upload-Code:

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

Antwort

19

Das erste, was zu prüfen ist, ob die Dateierweiterung in file1.FileName enthaltenen entspricht eine der zulässigen Erweiterungen. Wenn Sie wirklich sicherstellen möchten, dass der Benutzer keinen anderen Dateityp in eine zulässige Erweiterung umbenannt hat, müssen Sie in den Inhalt der Datei schauen, um zu erkennen, ob es sich um einen der zulässigen Dateitypen handelt.

Hier ist ein Beispiel, wie Sie überprüfen, ob die Dateierweiterung zu einer Liste von vordefinierten Erweiterungen gehört:

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

@Darrin Dimitrov .... Wie werde ich die Erweiterung überprüfen können Sie mir bieten jede Probe – SoftwareNerd

+0

@Darrin Dimitrov .. .thanks seine getan und ich zeige diese hochgeladenen Dateien in Tabelle vor dem Speichern der in Database ... Wenn ein Benutzer eine der hochgeladenen Datei löschen möchte, wie kann ich das tun ... – SoftwareNerd

6

können Sie verwenden, um die ContentType Eigenschaft der HttpPostedFileBase für eine grundlegende Überprüfung des Dateityp (MIME-Typs) : See MSDN's page on the Content-Type property here

Hier ist eine Möglichkeit, es zu tun:

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 ..

Für eine tiefere Inspektion müssen Sie jedoch den Dateiinhalt überprüfen. Es ist einfach, eine Dateierweiterung zu ändern ..

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

Verwendung Im Modell

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

Dies ist die tatsächliche Antwort –

+0

Dies ist die aktuelle und prägnante Antwort. Vielen Dank. –

Verwandte Themen