2015-01-15 6 views
31

Tutta la documentazione/esercitazioni/domande sull'elaborazione di un file caricato utilizzando FormData su un gestore WebAPI ASP.NET utilizzare MultipartFormDataStreamProvider per elaborare il flusso multipart per dividerlo nei campi e nei file modulo rilevanti .Caricamento file WebAPI - Senza scrivere file su disco

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

await Request.Content.ReadAsMultipartAsync(provider); 

foreach (MultipartFileData file in provider.FileData) 
{ 
    // File 
} 

Tuttavia, i file vengono scritti automaticamente in una directory durante l'elaborazione.

Sembra un sacco di problemi quando potrei semplicemente usare HttpContext.Current.Request.Files[0].InputStream per accedere direttamente a un flusso di file specificato in memoria.

In che modo WebAPI può accedere direttamente al flusso di file direttamente senza l'overhead di IO dell'utilizzo di MultipartFormDataStreamProvider?

esercitazione ufficiale: http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2

+1

Penso che [questa domanda] (http://stackoverflow.com/questions/19723064/webapi-formdata-upload-to-db-with -extra-parameters) dovrebbe rispondere alle tue esigenze. –

+0

Grazie @JonSusiak - Vorrei aver trovato che poche ore fa, ho finito per fare la stessa cosa esaminando il codice sorgente o 'MultipartFormDataStreamProvider' e usando il provider' MultipartStreamProvider' per darmi il caricamento del file in un 'MemoryStream' piuttosto che scriverlo su disco. Stavo solo ricevendo la risposta. – simbolo

+0

@simbolo - perché ** non ha ** usato 'HttpContext.Current.Request.Files [0] .InputStream'? Potresti spiegare lo svantaggio? – Merenzo

risposta

69

Risolto:

Utilizzare l'esistente semplice MultipartMemoryStreamProvider. Non sono richieste classi o provider personalizzati. Questo differisce dal duplicate question che ha risolto la soluzione scrivendo un fornitore personalizzato.

quindi utilizzarlo in un gestore di WebAPI come così:

public async Task<IHttpActionResult> UploadFile() 
{ 
    if (!Request.Content.IsMimeMultipartContent()) 
    { 
     return StatusCode(HttpStatusCode.UnsupportedMediaType); 
    }   

    var filesReadToProvider = await Request.Content.ReadAsMultipartAsync(); 

    foreach (var stream in filesReadToProvider.Contents) 
    { 
     var fileBytes = await stream.ReadAsByteArrayAsync(); 
    } 
} 
+0

Dove posso trovare IHttpActionResult? – guiomie

+0

@guiomie simple google: https://msdn.microsoft.com/en-us/library/system.web.http.ihttpactionresult(v=vs.118).aspx – simbolo

+0

Salvato il mio giorno. Grazie – Mariusz