2015-04-02 13 views
1

我在嘗試使用ASP.NET中的HTTP文件上載發送大文件時遇到困難。上傳並接收使用ASP.NET進行http壓縮的大文件時,出現「mime multipart stream意外結束」

目標是傳輸大於2GB的內容,壓縮以節省帶寬。發送3GB未壓縮的效果很好,所有文件都被正確接收並保存在磁盤上。然而,當我使用壓縮(無論是gzip或deflate),我從接收API得到以下錯誤:

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

的事情是,發送大量請求,只有當(約300MB爲上限),我得到例外。上傳200MB壓縮的作品。

這裏的上傳代碼:

using (var client = new HttpClient()) 
{ 
    using (var content = new MultipartFormDataContent()) 
    { 
     client.BaseAddress = new Uri(fileServerUrl); 
     client.DefaultRequestHeaders.TransferEncodingChunked = true; 

     CompressedContent compressedContent = new CompressedContent(content, "gzip"); 

     var request = new HttpRequestMessage(HttpMethod.Post, "/api/fileupload/") 
     { 
      Content = compressedContent 
     }; 

     var uploadResponse = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result; 
    } 
} 

CompressedContent類是WebApiContrib集助手

這裏的類的接收端

// CustomStreamProvider is an implementation to store the files uploaded on the disk 
var streamProvider = new CustomStreamProvider(uploadPath); 
var res = await Request.Content.ReadAsMultipartAsync(streamProvider); 
streamProvider.FileData.Select(file => new FileInfo(file.LocalFileName)).Select(fi => fi.FullName) 

你能爲我提供什麼線索問題是?爲什麼較大的內容(大於300MB)看起來被壓縮不當,而較小的內容傳輸得很好?

回答

2

嘗試將名稱添加到您的輸入如下:

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

可以使用自定義流追加了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); 

希望這有助於...

+0

謝謝你的回答。我已經遇到了兩種解決方案:給所有轉移完成的文件命名。 至於其他解決方案:先試過,現在再試一次。我使用FileStream處理請求,因爲使用MemoryStream會導致OutOfMemoryException。仍然沒有任何變化:上傳數據低於300MB的作品和上傳較大的內容導致錯誤提到:( – patryk 2015-04-06 10:02:07

1

你是否以塊壓縮文件?如果你能夠發送未壓縮的文件,那麼顯然,問題在於你的壓縮程序。使用gzip或Deflate可以限制文件大小。因此你需要壓縮成塊。

提示: 調試你的壓縮程序。嘗試壓縮文件並將其保存到硬盤並查看它是否可讀。

看看這個article

+1

文章已關閉! – 2017-03-07 16:15:45

1

檢查什麼是content-length,HTTP服務器端程序並不指望您發送不同內容的長度。您可能正在發送原始文件大小的內容長度,您發送壓縮內容的地方以及MultiPart解析器期望數據等於內容長度。

取而代之的是,您發送一個壓縮文件並將其解壓縮到服務器端,並且在應用程序級別上壓縮和解壓縮將不同,而不是插入http協議中。

您必須確保壓縮/解壓縮順序和內容長度在兩側都是正確的。據我所知,上傳壓縮在HTTP協議上並不常見。