41

在我看来,我有这个表格:

<!-- Bug (extra 'i') right here-----------v  -->
<!-- was: <form method="post" enctype="mulitipart/form-data" action="/Task/SaveFile"> -->
<form method="post" enctype="multipart/form-data" action="/Task/SaveFile">
<input type="file" id="FileBlob" name="FileBlob"/>
<input type="submit"  value="Save"/>
<input type="button" value="Cancel" onclick="window.location.href='/'" />
</form>

我的控制器中的这段代码:

public ActionResult SaveFile( FormCollection forms )
{
   bool errors = false;
   //this field is never empty, it contains the selected filename
   if ( string.IsNullOrEmpty( forms["FileBlob"] ) )
   {
       errors = true;
       ModelState.AddModelError( "FileBlob", "Please upload a file" );
   }
   else
   {
      string sFileName = forms["FileBlob"];
      var file = Request.Files["FileBlob"];
      //'file' is always null, and Request.Files.Count is always 0 ???
      if ( file != null )
      {
         byte[] buf = new byte[file.ContentLength];
         file.InputStream.Read( buf, 0, file.ContentLength );
         //do stuff with the bytes
      }
      else
      {
         errors = true;
         ModelState.AddModelError( "FileBlob", "Please upload a file" );
      }
   }
   if ( errors )
   {
      return ShowTheFormAgainResult(); 
   }
   else
   {
      return View();
   }
}

根据我能找到的每个代码示例,这似乎是这样做的方法。我尝试过使用小文件和大文件,结果没有区别。表单字段始终包含与我选择的文件名匹配的文件名,并且 Request.Files 集合始终为空。

我认为这无关紧要,但我正在使用 VS Development Web Server。AFAIK 它支持与 IIS 相同的文件上传。

时间不早了,我有可能遗漏了一些明显的东西。我会很感激任何建议。

4

4 回答 4

52

我不知道发布亵渎的政策是什么,但问题是:

enctype="mulitipart/form-data"

那里的额外内容i阻止了文件上传。必须运行 Fiddler 才能看到它从一开始就没有发送文件。

它应该是:

enctype="multipart/form-data"
于 2008-11-18T06:38:43.993 回答
16

对于将来可能会偶然发现这篇文章的人,这里是 Scott Hanselman 关于该主题的一篇精彩文章:回归基础案例研究:使用 ASP.NET MVC 实现 HTTP 文件上传,包括测试和模拟

于 2009-12-10T19:58:54.733 回答
2
var file = Request.Files[sFileName];

应该...

var file = Request.Files["FileBlob"];

也就是说,Request.Files.Count应该是 1 ... 嗯

于 2008-11-18T05:58:15.027 回答
0

很好,你发现了你的错误。

作为旁注,您需要尝试/捕获文件处理代码,以便您知道文件权限等何时设置不正确。

于 2008-11-18T16:27:48.937 回答