2012-10-25 153 views
8

我正在使用Visual Studio 2012 express附帶的MVC版本。 (Microsoft.AspNet.Mvc.4.0.20710.0)上傳文件MVC 4 Web API .NET 4

我認爲這是RTM版本。

我發現很多網上的例子,所有使用此代碼:在continueWith其中t.IsFaulted == true

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

但這個代碼總是結束。例外如下:

MIME多部分流的意外結束。 MIME多部分消息不是 完整。

這是我的客戶表單。沒有什麼奇特的,我想要做jQuery表單插件來上傳ajax,但我甚至無法用這種方式工作。

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

我讀過,它被分析器期望在每個消息的結尾/ CR/LF引起的,並且該錯誤已被固定在六月。

我無法弄清楚的是,如果它確實是固定的,爲什麼不包含此版本的MVC 4?爲什麼在互聯網上有這麼多的例子,這個代碼在這個版本的MVC 4中不起作用?

+1

ASP.NET Web API不是ASP.NET MVC的一部分,它有它自己的NuGet包 - > [ASP.NET Web API 4.0.20710.0](http://nuget.org/packages/aspnetwebapi)。請檢查您使用的是哪個版本。 – tpeczek

回答

19

您在文件input上缺少name屬性。

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

沒有它的輸入將不會被瀏覽器提交。所以你的表單數據是空的,導致IsFaulted被斷言。