2012-08-30 79 views
10

我試圖將上傳的文件保存到數據庫/內存流中,但我無法弄清楚。ASP .Net Web API RC:將多部分文件上傳到MemoryStore

所有我現在是這樣的:

public Task<HttpResponseMessage> AnswerQuestion() 
{ 
    if (!Request.Content.IsMimeMultipartContent()) 
    { 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
    } 

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

    var task = Request.Content.ReadAsMultipartAsync(provider). 
     ContinueWith<HttpResponseMessage>(t => 
     { 
      if (t.IsFaulted || t.IsCanceled) 
      { 
       Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception); 
      } 

      foreach (var file in provider.FileData) 
      { 
       Trace.WriteLine(file.Headers.ContentDisposition.FileName); 
       Trace.WriteLine("Server file path: " + file.LocalFileName); 
      } 
      return Request.CreateResponse(HttpStatusCode.OK); 
     }); 

    return task; 
} 

但是,當然,這只是將文件保存到特定的位置。我想我必須使用派生自MediaTypeFormatter的自定義類來將其保存到MemoryStream中,但我不知道如何去做。

請幫助。提前致謝!

回答

26

可以將多部分內容讀入摘要MultipartStreamProvider類的任何具體實現 - 請參閱http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/8fda60945d49#src%2fSystem.Net.Http.Formatting%2fMultipartStreamProvider.cs

它們是:

- MultipartMemoryStreamProvider 
- MultipartFileStreamProvider 
- MultipartFormDataStreamProvider 
- MultipartRelatedStreamProvider 

你的情況:

if (Request.Content.IsMimeMultipartContent()) 
{    
    var streamProvider = new MultipartMemoryStreamProvider(); 
    var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t => 
    { 
     foreach (var item in streamProvider.Contents) 
     { 
      //do something 
     } 
    }); 
} 
+2

這是否意味着每一個部分都將被加載到內存中的內容?如果你有大文件上傳,這意味着你必須編寫自己的'MultipartStreamProvider'實現? –

+2

「//做些什麼」有點像......? – simonlchilds

3

對於您的方案,您可以使用MultipartMemoryStreamProvider

[已更新]注意到您正在使用RC,我認爲MultipartMemoryStreamProvider是在RC之後添加的,目前在RTM中。