2012-08-30 15 views
10

アップロードしたファイルをデータベース/ memorystreamに保存しようとしていますが、わかりません。ASP .Net Web API RC:Memorystreamへのマルチパートファイルアップロード

私が今持っているすべてはこれです:

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

しかし、もちろん、この唯一の特定の場所にファイルを保存します。私はMediaStreamに保存するためにMediaTypeFormatterから派生したカスタムクラスで作業しなければならないと思いますが、どうやってそれを行うのか分かりません。

助けてください。前もって感謝します!

答えて

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

'/ do something'ビットはどのように見えますか? – simonlchilds

3

MultipartMemoryStreamProviderを使用することができます。

[]あなたがRCを使用していることに気付きましたが、MultipartMemoryStreamProviderがRC後に追加され、現在RTMにあると思います。