我在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.)我會如何改變文件名稱,像'入門圖像'?
用途: ''form'標記中的'enctype =「multipart/form-data」' – hjpotter92 2012-04-04 22:37:22
在上面的Create操作中,我想這是ActionResult的[HttpPost]版本? – MikeTWebb 2012-04-04 22:42:23