41

I have this form in my view:

<!-- 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>

And this code in my controller:

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

Based on every code sample I've been able to find, this seems like the way to do it. I've tried with small and large files, with no difference in the result. The form field always contains the filename which matches what I've chosen, and the Request.Files collection is always empty.

I don't think it's relevant, but I'm using the VS Development Web Server. AFAIK it supports file uploads the same as IIS.

It's getting late and there's a chance I'm missing something obvious. I'd be grateful for any advice.

codekaizen
  • 26,990
  • 7
  • 84
  • 140
Jason Diller
  • 3,360
  • 2
  • 24
  • 25
  • Refer http://stackoverflow.com/questions/9411563/asp-net-mvc3-razor-file-upload-gives-zero-as-file-count for a related problem – LCJ Dec 20 '12 at 14:44

4 Answers4

52

I don't know what the policy is on posting profanity, but here's the problem:

enctype="mulitipart/form-data"

The extra i in there stopped the file from uploading. Had to run Fiddler to see that it was never sending the file in the first place.

It should read:

enctype="multipart/form-data"
George Stocker
  • 57,289
  • 29
  • 176
  • 237
Jason Diller
  • 3,360
  • 2
  • 24
  • 25
  • HAHA :) i missed that! good work! Maybe u can update the bottom of your initial post by mentioning the solution and marking your own answer, etc. nice one! – Pure.Krome Nov 18 '08 at 22:49
  • Or perhaps update the code, so people copy-pasting the first example at least get the right code. – Daniel O Jan 19 '10 at 03:48
  • 2
    I've already had this problem twice due to copy-pasting the enctype from this post! – Felipe Lima Jan 26 '10 at 17:21
  • +1 from the future. I googled the enctype for an MVC form, never can remember, and copied the enctype without reading the entire thread. Getting rather upset that it wasn't working. Darn that extra i, it bites again! :) – Tommy Jul 16 '10 at 13:03
  • @using(Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" } )){} – ArthNRick Mar 06 '17 at 16:00
16

For people who may stumble on to this post in the future, here a great post by Scott Hanselman on the subject: A Back To Basics Case Study: Implementing HTTP File Upload with ASP.NET MVC including Tests and Mocks

Jason
  • 4,232
  • 3
  • 23
  • 31
  • 10
    And an updated version by Phil Haack, including enhancements from ASP.Net MVC2: http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx – JasonBirch Jul 17 '10 at 23:42
2
var file = Request.Files[sFileName];

should be...

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

that said, Request.Files.Count should be 1 ... hmmm

Pure.Krome
  • 84,693
  • 113
  • 396
  • 647
  • Changed it and tried again to be sure but no change. Request.Files["FileBlob"] also returns null. Request.Files.Count is still 0. I'll edit the code sample though to clarify. – Jason Diller Nov 18 '08 at 06:14
0

Good that you found your error.

As a side note you'll want a try/catch around the file handling code so you'll know when file permissions etc. are not setup correctly.

Todd Smith
  • 17,084
  • 11
  • 59
  • 78