2010-05-13 8 views
13

Ich habe einen Controller, der eine Verbindung zu einer URL herstellt, um eine CSV-Datei abzurufen.Groovy Grails, Wie streamen oder puffern Sie eine große Datei in der Antwort eines Controllers?

Ich kann die Datei in der Antwort mit dem folgenden Code senden, das funktioniert gut.

Allerdings denke ich, dass diese Methode für eine große Datei ungeeignet ist, da die gesamte Datei in den Speicher der Controller geladen wird.

Ich möchte in der Lage sein, die Datei Chunk für Chunk zu lesen und die Datei in die Antwort Chunk für Chunk schreiben.

Irgendwelche Ideen?

Antwort

23

Groovy OutputStreams kann InputStreams direkt mit dem Operator << übernehmen. Der OutputStream zieht die Daten automatisch mit einem entsprechend großen Pufferspeicher.

Folgendes sollte die Daten effizient kopieren, auch wenn die CSV-Datei sehr groß ist.

def fileURL = "www.mysite.com/input.csv" 
def thisUrl = new URL(fileURL); 
def connection = thisUrl.openConnection(); 
def cvsInputStream = connection.inputStream 

response.setHeader "Content-disposition", "attachment; 
filename=${'output.csv'}" 
response.contentType = 'text/csv' 
response.outputStream << csvInputStream 
response.outputStream.flush() 
+3

Gute Lösung, aber denken Sie daran, auch den InputStream zu schließen. Eine sichere Alternative ist die Verwendung von connection.withInputStream {...} – stenix