2012-04-04 61 views
0

我在PHP中有很多這方面的經驗,但對於ASP.net來說還是比較新的。我已經發現了一些圍繞網絡的教程,這些教程已經讓我走了這麼遠,但我目前遇到了問題。在ASP.net MVC 3中處理HTML表單的文件上傳c#

因此,爲了總結我想要完成的工作,我有一個頁面,我希望用戶提交參賽作品。我使用HTML表單來收集條目標題,描述等內容,並希望能夠提交表示其條目的圖像。

當他們選擇提供圖片時,我希望它使用類似以下路徑上傳: // entries // entry-image。

我的數據庫將只保存代表圖像路徑的varchar。我想添加一些明顯的驗證文件上傳,如限制文件大小,並只允許某些文件擴展名。應該用一些標準名稱保存圖像(如上面路徑中的'entry-image'),覆蓋可能已經在該條目目錄中的任何圖像。

現在從我的HTML表單獲取文本輸入不是一個問題,但獲取文件是。我目前還沒有對錶格進行驗證,只是試圖讓它在最基本的狀態下工作。這裏是我的HTML的刪減版本:

<form method="post" action="../Entry/Create"> 
      <input type="text" id="EntryTitle" name="EntryTitle" /> 
      <p id="char-remaining">(100 characters remaining)</p> 

      <input type="text" id="EntryVideo" name="EntryVideo" /> 
      <p id="vid-desc">(URL of the Video to Embed)</p> 

      <input type="file" id="ImageFile" name="ImageFile" /> 
      <p id="file-desc">(200x200px, jpeg, png, gif)</p> 

      <textarea id="EntryDesc" name="EntryDesc"></textarea> 
      <p id="entry-desc"></p> 
      <button id="new-entry-save">save</button> 
</form> 

現在,這裏是我在我的EntryController類創建行動:

public ActionResult Create(string EntryTitle, string EntryVideo, HttpPostedFileBase ImageFile, string EntryDesc) 
    { 
     if (Session["User"] != null) 
     { 
      User currentUser = (User)Session["User"]; 

      //string savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(ImageFile.FileName)); 
      //ImageFile.SaveAs(savedFileName); 

      Entry newEntry = new Entry(); 

      newEntry.Title = EntryTitle; 
      newEntry.EmbedURL = EntryVideo; 
      newEntry.Description = EntryDesc; 
      //newEntry.ImagePath = savedFileName; 
      newEntry.UserId = currentUser.UserId; 

      db.Entries.Add(newEntry); 
      db.SaveChanges(); 


     } 

     return RedirectToAction("MyPage", "User"); 
    } 

你會發現我有幾行註釋掉。當註釋掉時,文本輸入值會被正確接收並存儲在我的數據庫中。但是,留下未註釋的,在第一個註釋行上拋出NullReferenceException。

我在我的動作中使用的代碼幾乎只是從教程中複製和粘貼,我意識到如果它確實有效,它不會完成我上面寫的目標,因爲它不檢查用於文件擴展或將文件名改爲標準。

所以我的主要問題是:

1)爲什麼我會收到一個NullReferenceException當我其實HTML表單上提供的文件嗎?

2.)我將如何去驗證提交的文件? (大小,擴展名,尺寸等)

3.)我會如何改變文件名稱,像'入門圖像'?

+1

用途: ''form'標記中的'enctype =「multipart/form-data」' – hjpotter92 2012-04-04 22:37:22

+0

在上面的Create操作中,我想這是ActionResult的[HttpPost]版本? – MikeTWebb 2012-04-04 22:42:23

回答

2

這裏有一個答案,上述數2:

調用JavaScript函數在您提交的行動爲查看

<input type="submit" id="thePageSubmit" value="Upload" onclick="return IsValidExtention();" /> 

然後在使用Javascript fuinction這樣做

function IsValidExtention() { 
     var it = document.forms[0].elements["ImageFile"].value; 
     it = it.substring(it.lastIndexOf('\\') + 1); 
     if (it.length > 0) { 
      if (it.toLowerCase().indexOf(".exe")!=-1) { 
       alert("We are unable to upload .exe files."); 
       return false; 
      } 
      if (it.toLowerCase().indexOf(".js") != -1) { 
       alert("We are unable to upload .js files."); 
       return false; 
      } 
     } 
     else{ 
      return false; 
     } 
     return true; 
    } 
+0

在我的行動中是否沒有一種無javascript的方式來處理所有這些以便將所有內容保存在一個位置?如果JavaScript發現所有的輸入都是有效的,那麼該動作如何被調用呢? – Danny 2012-04-04 22:54:26

+0

如果Submit控件在Onclick事件(即提交表單)時返回true,則會自動調用該操作。你可以在你的控制器中處理這個。但是,那麼你的頁面有張貼到服務器,然後重定向回你的頁面,如果一些推廣無效。海事組織的一種糟糕的用戶體驗。 – MikeTWebb 2012-04-04 22:58:02

+0

我明白了。是的重點回來的好點。 – Danny 2012-04-04 23:08:30

1

如果它尚未存在,請將enctype="multipart/form-data"屬性添加到您的表單元素。

+0

確定這需要照顧我的第一個問題,除了不再拋出。 – Danny 2012-04-04 22:48:42