2009-06-23 6 views
1

J'ai un modèle avec les propriétés ImagePath et PDFPath.Téléchargement de différents types de fichiers pour différentes propriétés de modèle

Lorsque vous cliquez sur Enregistrer, cela appelle la méthode d'action POST dans le contrôleur. Je dois vérifier qu'ils n'ont téléchargé que des fichiers image et des fichiers pdf. Si elles ont téléchargé quelque chose autre que ces types de fichiers que je veux définir une erreur de ModelState ce qui suit:

ModelState.AddModelError("ImagePath", "Only image files are accepted"); 
ModelState.SetModelValue("ImagePath", new ValueProviderResult(null, null, null)); 

Le problème est que je dois définir les propriétés correctes dans le AddModelError. Le problème étant qu'ils auraient pu mettre un fichier * .doc dans ImagePath ou PDFPath donc je ne sais pas lequel signaler comme champ d'erreur.

Comment puis-je également m'assurer qu'ils ne téléchargent que les types de fichiers Ceratin? RegEx?

Merci

EDIT: Voici mon code de contrôleur.

[AcceptVerbs(HttpVerbs.Post)] 
    [Authorize] 
    public ActionResult Create([Bind(Prefix = "", Exclude = "ID")] News item) 
    { 
     string imageUrl = ""; 
     string pdfurl = ""; 

     try 
     { 
      News.CheckForErrors(item); 
     } 
     catch (RulesException ex) 
     { 
      ex.AddModelStateErrors(ModelState, null); 
     } 

     foreach (string inputTagName in Request.Files) 
     { 
      HttpPostedFileBase file = Request.Files[inputTagName]; 
      if (file.ContentLength > 0) 
      { 
       string filePath = Path.Combine(HttpContext.Server.MapPath("/uploads"), Path.GetFileName(file.FileName)); 
       if (Path.GetExtension(file.FileName).ToLower() != ".jpg" || Path.GetExtension(file.FileName).ToLower() != ".pdf") 
       { 
        //HELP! - Which model has the property error ImagePath/PDFPath? 
        ModelState.AddModelError("ImagePath", "Only JPG image files are accepted"); 
        ModelState.SetModelValue("ImagePath", new ValueProviderResult(null, null, null)); 
        break; 
       } 

       imageUrl = "/uploads/" + file.FileName; 
      } 
     } 

     if (!ModelState.IsValid) 
     { 

       return View(item); 

     } 

     try 
     { 
      item.Save(User.Identity.Name); 

     } 
     catch (Exception x) 
     { 

     } 



     return RedirectToAction("Index"); 

    } 
+0

Qu'est-ce que ImagePath (et PDFPath) propriété? Est-ce un TextBox ou ? –

+0

Yup exactement cela. – Jon

+0

Pouvez-vous poster votre code de contrôleur ici? –

Répondre

1

Vous devez quelque chose comme méthode GetFileByExtension():

HttpPostedFileBase GetFileByExtension(HttpFileCollectionBase files, string[] extensions) 
{ 
    Func<string, bool> extensionIsValid = 
     fileExtension => extensions.Any(
      extension => String.Compare(extension, fileExtension, true) == 0 
     ); 

    return files.Cast<string>().Select(x => files[x]).Single(
     file => extensionIsValid(System.IO.Path.GetExtension(file.FileName)) 
     ); 
} 

ou:

IList<HttpPostedFileBase> GetAllFilesByExtension(HttpFileCollectionBase files, string[] extensions) 
{ 
    Func<string, bool> extensionIsValid = 
     fileExtension => extensions.Any(
      extension => String.Compare(extension, fileExtension, true) == 0 
     ); 

    return files.Cast<string>().Select(x => files[x]).Where(
     file => extensionIsValid(System.IO.Path.GetExtension(file.FileName)) 
     ).ToList(); 
} 

exemple:

var imageFile = GetFileByExtension(Request.Files, 
            new [] { ".jpg", ".gif", ".png", ".bmp" }); 

var pdfFile = GetFileByExtension(Request.Files, new [] { ".pdf" }); 

ou:

var imageFiles = GetAllFilesByExtension(Request.Files, 
            new [] { ".jpg", ".gif", ".png", ".bmp" }); 

var pdfFiles = GetAllFilesByExtension(Request.Files, new [] { ".pdf" }); 

MISE À JOUR:

Peut-être que vous devriez essayer de télécharger à l'aide des formulaires séparés/actions pour différents ajouts (quelque chose comme/upload/créer newsid = 1 uploadtype = l'image pour les images et/upload/créer newsid?? = 1? Uploadtype = pdf pour les PDF). Votre action Upload.Create pourrait ressembler à ceci:

public class UploadController : Controller 
{ 
    public ActionResult Create(int newsId, string uploadType) 
    { 
     if(uploadType == "image") 
     { 
      // uploading only images 
      var imageFiles = GetAllFilesByExtension(Request.Files, new [] { ".jpg", ".gif", ".png", ".bmp" }); 
      ... 
     } 
    } 
} 

Dans ce cas, vous savez toujours le type de fichiers qui doivent être téléchargés à l'action

+0

Je viens de réaliser que cela n'a pas vraiment répondu à ma question. Si elles téléchargent une image d'une extension différente qui signifie son image non valide ou pdf valide, comment puis-je définir l'erreur ModelState sur la propriété correcte? – Jon

+0

Quelque chose comme ça?: var imageFiles = GetAllFilesByExtension (Request.Files, new [] {".jpg", ".gif", ".png", ".bmp"}); if (imageFiles.Count() == 0) ModelState.AddModelError ("ImagePath", "Seuls les fichiers image JPG sont acceptés"); –

+0

Et s'ils mettent un fichier pdf dans l'entrée d'image? – Jon

Questions connexes