2009-06-23 74 views
1

我有一个模型与ImagePath和PDFPath属性。上传不同的文件类型为不同的模型属性

当他们点击保存时,它会在控制器中调用POST操作方法。我需要检查他们是否只上传图像文件和PDF文件。如果他们比上传的文件类型,这些以外的东西我想设置的ModelState错误有以下:

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

的问题是我需要设置在AddModelError正确的属性。问题在于它们可能会在ImagePath或PDFPath中放置一个* .doc文件,因此我不知道哪一个报告为错误字段。

我该如何确保他们只上传角蛋白文件类型?正则表达式?

谢谢

编辑:这是我的控制器代码。

[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

什么是ImagePath的(和PDFPath)的财产?它是一个文本框或? – 2009-06-23 15:51:32

+0

是的。 – Jon 2009-06-23 18:40:27

回答

1

你需要的东西像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)) 
     ); 
} 

或:

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

例如:

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

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

或:

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

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

更新:

也许你应该尝试使用不同的形式/不同的上传操作(像/上传/创建NewSID的= 1 uploadtype =为图像的图像和/上传/创建上传NewSID的?? = 1?uploadtype = pdf for PDFs)。你Upload.C​​reate行动可能是这样的:

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

在这种情况下,你总是知道文件的类型,这应该被上传到行动