2016-10-24 7 views
0

Wie liest man nur einen Teil einer Datei als Stream in der Web API und führt Aktionen in diesem Stream aus, ohne die gesamte Datei in den Speicher zu übernehmen? NB: Ich möchte die Datei vor dem Lesen nicht irgendwo speichern. Sie wird auf einen Web-API-Controller hochgeladen.Web API 2 - Streamen einer Datei

Aber was ich wirklich mag, ist der folgende Pseudo-Code implementiert:

foreach file in Request 
{ 
    using (var sr = new StreamReader(fileStream)) 
    { 
     string firstLine = sr.ReadLine() ?? ""; 
     if (firstLine contains the magic I need) 
     { 
      // would do something with this line, 
      // then scrap the stream and start reading the next file stream 
      continue; 
     } 
    } 
} 
+0

Wenn die Datei nicht gespeichert wird, bedeutet dies, dass es sich um Speicher handelt. Ansonsten haben Sie nicht die Möglichkeit die Datei zu lesen – Tinwor

+0

Also beim Hochladen des Controllers hat die ganze Datei von Anfang an im Speicher? – user2330270

+0

Es streamt es nicht vom Client? – user2330270

Antwort

0

Wie hier gefunden: http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/

Sie können „Force-API in gestreamt Modus, mit den hochgeladenen Dateien zu tun eher als den gesamten Anforderungs-Eingabestrom im Speicher zu puffern. "

public class NoBufferPolicySelector : WebHostBufferPolicySelector 
{ 
    public override bool UseBufferedInputStream(object hostContext) 
    { 
     var context = hostContext as HttpContextBase; 

     if (context != null) 
     { 
     if (string.Equals(context.Request.RequestContext.RouteData.Values["controller"].ToString(), "uploading", StringComparison.InvariantCultureIgnoreCase)) 
      return false; 
     } 

     return true; 
    } 

    public override bool UseBufferedOutputStream(HttpResponseMessage response) 
    { 
     return base.UseBufferedOutputStream(response); 
    } 
} 

public interface IHostBufferPolicySelector 
{ 
    bool UseBufferedInputStream(object hostContext); 
    bool UseBufferedOutputStream(HttpResponseMessage response); 
} 

Leider scheint es Ihnen nicht um es mit Web-API in der Post wie erwähnt zu bekommen, da dies stark auf system.web ist.