上传文件与ASP.Net MVC – 获取名称,但没有文件stream,我做错了什么?

我的观点是这样:

<!-- 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(); } } 

基于我已经能够find的每个代码示例,这似乎是如何做到这一点。 我已经尝试过大小​​文件,结果没有任何区别。 表单字段总是包含与我select的文件名相匹配的文件名,Request.Files集合总是空的。

我不认为这是相关的,但我正在使用VS开发Web服务器。 AFAIK它支持file upload相同的IIS。

天色已晚了,我错过了一些显而易见的事情。 我会很感激任何意见。

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

 enctype="mulitipart/form-data" 

在那里额外的i停止了上传文件。 必须运行Fiddler来查看它从来没有发送过这个文件。

它应该是:

 enctype="multipart/form-data" 

对于那些未来可能会遇到这个问题的人来说,这里是Scott Hanselman关于这个主题的一篇很棒的文章: 回到基础案例研究:使用ASP.NET MVC实现HTTPfile upload,包括testing和Mocks

 var file = Request.Files[sFileName]; 

应该…

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

那就是说, Request.Files.Count应该是1 … hmmm

很好,你发现你的错误。

作为一个便笺,你会想要一个围绕文件处理代码的try / catch,这样你就会知道什么时候文件权限等设置不正确。