2012-08-30 15 views
10

Sto cercando di salvare (un) file caricati su un database/memorandtream, ma non riesco a capirlo.ASP .Net Web API RC: caricamento file multipart in Memorystream

Tutto quello che ho in questo momento è questa:

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

Ma naturalmente questo salva solo il file in una posizione specifica. Penso di dover lavorare con una classe personalizzata derivata da MediaTypeFormatter per salvarla in un MemoryStream, ma non vedo come farlo.

Per favore aiuto. Grazie in anticipo!

risposta

26

Il contenuto multiparte può essere letto in qualsiasi versione concreta della classe MultipartStreamProvider astratta - vedere http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/8fda60945d49#src%2fSystem.Net.Http.Formatting%2fMultipartStreamProvider.cs.

Questi sono:

- MultipartMemoryStreamProvider 
- MultipartFileStreamProvider 
- MultipartFormDataStreamProvider 
- MultipartRelatedStreamProvider 

Nel tuo caso:

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

cosa significa il contenuto di ogni parte verranno caricati in memoria? Se si caricano file di grandi dimensioni, ciò significa che è necessario scrivere la propria implementazione 'MultipartStreamProvider'? –

+2

Che aspetto avrebbe il bit "// fare qualcosa" ...? – simonlchilds

3

È possibile utilizzare MultipartMemoryStreamProvider per il proprio scenario.

[Aggiornato] Notato che si sta utilizzando RC, penso che MultipartMemoryStreamProvider è stato aggiunto post-RC ed è attualmente in RTM.

Problemi correlati