2012-04-04 53 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