2009-06-23 29 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" }); 
      ... 
     } 
    } 
} 

在這種情況下,你總是知道文件的類型,這應該被上傳到行動