我在 PHP 方面有丰富的经验,但对 ASP.net 还是很陌生。我在网上找到了一些教程,这些教程让我走到了这一步,但我目前遇到了问题。
所以总结一下我想要完成的事情,我有一个页面,我希望用户在其中提交参赛作品。我使用 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 类中的 Create 操作:
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.) 当我实际上在 HTML 表单上提供文件时,为什么会收到 NullReferenceException?
2.) 我将如何验证提交的文件?(尺寸、扩展、尺寸等)
3.) 我将如何将文件名更改为“entry-image”之类的名称?