Asp.net MVC 1.0 RTM中实现文件上传

在我们开始之前,你需要知道一个form以post方式上传文件的方式,你将要增加一个特别的enctype attribute到form标签上,为了这个么,我们需要创建一个像这样的form标签:



  1. <% using (Html.BeginForm("Edit", "Person", FormMethod.Post, new { enctype = "multipart/form-data" })) {%>


<% using (Html.BeginForm("Edit", "Person", FormMethod.Post, new { enctype = "multipart/form-data" })) {%>

然后我们只需要增加一个Type为"file"的input,一个sumbit按钮的表单.你必须确保input上有"name" attribute.我们也能任何一个我们想要的form上:



  1. <table>
  2. <tr>
  3. <td><input type="file" id="picture" name="picture" /></td>
  4. </tr>
  5. <tr>
  6. <td><input type="submit" value="Upload" /></td>
  7. </tr>
  8. </table>


<table>     <tr>         <td><input type="file" id="picture" name="picture" /></td>     </tr>     <tr>         <td><input type="submit" value="Upload" /></td>     </tr> </table>

现在我们自己的表单了,准备好服务器端的Action.我们这么做:



  1. [AcceptVerbs(HttpVerbs.Post)]
  2. public ActionResult Edit(HttpPostedFileBase picture)
  3. {
  4. if (picture != null)
  5. {
  6. picture.SaveAs("C:\wherever\" + picture.FileName);
  7. }
  8. }


[AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(HttpPostedFileBase picture) {     if (picture != null)     {         picture.SaveAs("C:\wherever\" + picture.FileName);     } }

漂亮吧!现在只剩下测试它了.我使用了​​Moq 3​​,我们只需要mock出一个文件,并放入方法中:



  1. var personPicture = new Mock<HttpPostedFileBase>();
  2. personPicture.Setup(i => i.FileName).Returns("person.jpg");
  3. personPicture.Setup(i => i.InputStream).Returns(new MemoryStream(Encoding.UTF8.GetBytes("")));

  4. var controller = new PersonController();
  5. controller.Edit(personPicture.Object);

  6. personPicture.Verify(p => p.SaveAs("C:\wherever\person.jpg");


var personPicture = new Mock<HttpPostedFileBase>(); personPicture.Setup(i => i.FileName).Returns("person.jpg"); personPicture.Setup(i => i.InputStream).Returns(new MemoryStream(Encoding.UTF8.GetBytes("")));  var controller = new PersonController(); controller.Edit(personPicture.Object);  personPicture.Verify(p => p.SaveAs("C:\wherever\person.jpg");

哇.所有能mock出所有我们有的东西,假装控制器中少许属性,调用方法,然后验证图片上适当的方法是否被调用.就是那么简单!

希望你已知道这些,但如果你不知,希望这篇post能帮到你.

翻译:PetterLiu ​​ ​​​ ​​ Source​