2016-04-05 14 views
0

Ich versuche, große Dateien in eine Webanwendung mit der Spark framework hochladen, aber ich habe zu wenig Speicherfehler. Scheint, dass Spark den Anforderungstext in Arbeitsspeicher zwischenspeichert. Ich möchte entweder Dateiuploads auf der Festplatte zwischenspeichern oder die Anfrage als Stream lesen.Große Dateiupload mit Spark-Framework

Ich habe versucht, die streaming support von Apache Commons FileUpload, aber es scheint, dass der Aufruf von request.raw(). GetInputStream() bewirkt Spark den gesamten Körper in den Speicher zu lesen und eine InputStream Ansicht dieses Stück Speicher zurückgibt, wie getan von this code. Basierend auf dem Kommentar in der Datei ist dies so, dass getInputStream mehrmals aufgerufen werden kann. Gibt es eine Möglichkeit, dieses Verhalten zu ändern?

Antwort

0

Kurze Antwort ist nicht, dass ich sehen kann.

SparkServerFactory erstellt den JettyHandler, der über eine private statische Klasse HttpRequestWrapper verfügt, als den InputStream in den Speicher.

All das statische Zeug bedeutet keine Verlängerung zur Verfügung.

0

Ich hatte kürzlich das gleiche Problem und ich fand heraus, dass Sie das Caching umgehen konnten. Ich tue dies mit der folgenden Funktion:

public ServletInputStream getInputStream(Request request) throws IOException { 
    final HttpServletRequest raw = request.raw(); 
    if (raw instanceof ServletRequestWrapper) { 
     return ((ServletRequestWrapper) raw).getRequest().getInputStream(); 
    } 

    return raw.getInputStream(); 
} 

Das hat mit Spark-2.4 getestet.

Ich bin nicht vertraut mit den inneren Funktionen von Spark so ein potentiall, kleiner Nachteil mit dieser Funktion ist, dass Sie nicht wissen, ob Sie den zwischengespeicherten InputStream erhalten oder nicht, die zwischengespeicherte Version ist wiederverwendbar, die nicht zwischengespeichert ist nicht.

um diesen Nachteil zu bekommen ich nehme an, Sie eine ähnliche Funktion wie die folgenden implementieren könnten:

public boolean hasCachedInputStream(Request request) { 
    return !(raw instanceof ServletRequestWrapper); 
} 
Verwandte Themen