2012-12-07 30 views
22

在ASP.NET上找到的教程之後,實現了用於執行異步文件上傳的Web API控制器方法,如下所示:ASP.NET Web API,從Flex上傳時MIME多部分流的意外結束FileReference

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) 
      { 
       Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception); 
      } 

      return Request.CreateResponse(HttpStatusCode.OK); 
     }); 

    return task; 
} 

通過標準的多部分HTML表單上傳文件非常完美。但是,當另一個開發人員嘗試通過Flex的FileReference類構建的多部分表單上載文件時,會引發錯誤:

MIME多部分流的意外結束。 MIME多部分郵件不完整。

我不知道問題出在Web API還是Flex。我發現了一些沒有任何影響的相關修補程序(Multipart form POST using ASP.Net Web API),以及最近的一個修補程序("MIME multipart stream. MIME multipart message is not complete" error on webapi upload)。如果第二個鏈接成立,那麼是否有人知道它是否可以通過Nuget獲得當前的Web API版本?討論是在5月份,Nuget的最新版本是8月份,所以我假定已經部署了此修復程序,而不是我的問題的根本原因。

+9

將佔位符放在此處,直到其中一個已刪除的答案被取消刪除。我有同樣的問題,修復很簡單 - 爲文件上傳元素添加一個名稱。 ''。白癡。 – Will

+1

如果沒有名稱,則不會發布輸入。 – liammclennan

回答

7

通過閱讀您現有的研究並追蹤到codeplex問題報告,看起來其他人確認此問題在9月仍存在。

他們認爲MVC 4無法解析上傳而沒有終止「\ r \ n」。

這個問題很簡單,但非常難以解決。的問題是,Uploadify不>未添加爲「\ r \ n」個在MultiPartForm消息末尾

http://aspnetwebstack.codeplex.com/discussions/354215

這可能是值得檢查了Flex上傳添加爲「\ r \ n 「

+0

不確定Flex是否有其他類型的上傳?但Flash的FileReference.upload()不添加它。我認爲這就是爲什麼Uploadify不會添加它,因爲它們不能真正改變默認行爲。 – jayarjo

33

我和flex有同樣的問題。下面是解決它的代碼。基本上我用一個自定義的流來追加asp.net web api所期待的換行符。

 Stream reqStream = Request.Content.ReadAsStreamAsync().Result; 
     MemoryStream tempStream = new MemoryStream(); 
     reqStream.CopyTo(tempStream); 



     tempStream.Seek(0, SeekOrigin.End); 
     StreamWriter writer = new StreamWriter(tempStream); 
     writer.WriteLine(); 
     writer.Flush(); 
     tempStream.Position = 0; 


     StreamContent streamContent = new StreamContent(tempStream); 
     foreach(var header in Request.Content.Headers) 
     { 
      streamContent.Headers.Add(header.Key, header.Value); 
     } 

     // Read the form data and return an async task. 
     await streamContent.ReadAsMultipartAsync(provider); 

希望這會有所幫助。

+2

感謝您抽出時間發佈此消息 – leojh

+2

目前爲止,我僅見過針對Flash POST的解決方法。如果它創建一個虛擬流來檢測內部流的末尾並添加一個CRLF,效率會更高。如果文件很大,這會很容易炸燬。 – georgiosd

+1

謝謝,謝謝 – AngelKyriako

29

我有MVC4同樣的問題,但會是正確的,一個名字添加到您的輸入.....

<input type="file" id="fileInput" name="fileInput"/> 

,所有的魔法是備份和工作!

+0

也爲我工作 – Mark

+0

這對我來說絕對有效,謝謝! – JSancho

+0

就這麼簡單。謝謝 – Amanda

4

對於那些在這裏登陸谷歌搜索:

MIME多流意外結束。 MIME多部分郵件不完整。

多次讀取請求流也會導致此異常。我掙扎了好幾個小時,直到我找到一個消息來源解釋請求流只能被讀取一次。

在我的情況下,我嘗試使用MultipartMemoryStreamProvider來讀取請求流,同時讓ASP.NET通過爲我的api方法指定參數(來自請求主體)來爲我做一些魔術。

+0

對我來說也是如此。非常感謝 –

2

確保圖像文件首次上傳的虛擬目錄(如下圖所示的「〜/ App_Data」目錄)在物理上存在。當您發佈項目時,它可能不在輸出文件中。

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