Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upload a file MVC 4 Web API .NET 4

I'm using the version of MVC that shipped with Visual Studio 2012 express. (Microsoft.AspNet.Mvc.4.0.20710.0)

I assume this is RTM version.

I've found plenty of examples online which all use this code:

    public Task<HttpResponseMessage> PostFormData()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        // Read the form data and return an async task.
        var task = Request.Content.ReadAsMultipartAsync(provider).
            ContinueWith<HttpResponseMessage>(t =>
            {
                if (t.IsFaulted || t.IsCanceled)
                {
                    return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
                }

                // This illustrates how to get the file names.
                foreach (MultipartFileData file in provider.FileData)
                {
                    Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                    Trace.WriteLine("Server file path: " + file.LocalFileName);
                }
                return Request.CreateResponse(HttpStatusCode.OK);
            });

        return task;
    }

But this code always ends up in continueWith where t.IsFaulted == true. The exception reads:

Unexpected end of MIME multipart stream. MIME multipart message is not complete.

Here is my client form. NOthing fancy, I want to do jquery form pluging for ajax upload, but I can't even get this way to work.

<form name="uploadForm" method="post" enctype="multipart/form-data" action="api/upload" >
    <input type="file" />
    <input type="submit" value="Upload" />
</form>

I've read that it is caused by the parser expecting /CR /LF at the end of each message, and that bug has been fixed in June.

What I cannot figure out is, if it was really fixed, why isn't it included this version of MVC 4? Why do so many examples on the internet tout that this code works when it does not in this version of MVC 4?

like image 406
JayPrime2012 Avatar asked Oct 25 '12 18:10

JayPrime2012


People also ask

How to upload a file to the web server using mvc4?

The file can be upload to the web server. By default, the process of file uploading is asynchronous. The developers of ASP.NET use the HTML file input field. Now I illustrate the process of uploading a file to the web server. Create a MVC4 Web API application "FileUpload". Start Visual Studio 2010 and select "New Project" from the Start Page.

How to upload multiple files using a web API controller?

The controller in the API has the code to upload multiple files and I have written it for C# and VB developers. You can call a Web API controller from any client application, which is capable of making an http POST request either using jQuery Ajax or XMLHttpRequest object. Start Visual Studio and from the top left choose File -> New Project.

How does upload work in ASP NET MVC?

When the upload is started, the uploader packs the files into a POST request and sends this request to the server. ASP.NET caches all data in server memory or to disk depending on the uploaded file size. ASP.NET MVC defines the controller and appropriate action method that will handle the request.

How to create a web API using MVC 4?

From the Project Template under New ASP.NET MVC 4 Project, select Web API template and press OK. If you are newbie in Web API, then I would recommend you to check the below link for step by step creation and implementation of your first Web API application.


1 Answers

You are missing a name attribute on your file input.

<form name="uploadForm" method="post" enctype="multipart/form-data" action="api/upload" >
    <input name="myFile" type="file" />
    <input type="submit" value="Upload" />
</form>

Inputs without it will not get submitted by the browser. So your formdata is empty resulting in IsFaulted being asserted.

like image 77
Andy Abbott Avatar answered Oct 21 '22 06:10

Andy Abbott