14 Stimmen

Groovy Grails, Wie streamen oder puffern Sie eine große Datei in der Antwort eines Controllers?

Ich habe einen Controller, der eine Verbindung zu einer URL herstellt, um eine csv-Datei abzurufen.

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

    def fileURL = "www.mysite.com/input.csv"
    def thisUrl = new URL(fileURL);
    def connection = thisUrl.openConnection();
    def output = connection.content.text;

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

Ich denke jedoch, dass diese Methode für eine große Datei ungeeignet ist, da die gesamte Datei in den Speicher des Controllers geladen wird.

Ich möchte in der Lage sein, die Datei chunkweise zu lesen und die Datei chunkweise in die Antwort zu schreiben.

Irgendwelche Ideen?

24voto

ataylor Punkte 62676

Groovy OutputStreams können InputStreams direkt mit der << Betreiber. Der OutputStream zieht die Daten automatisch mit einem entsprechend dimensionierten Puffer.

Die folgenden Schritte sollten die Daten effizient kopieren, selbst wenn die CSV-Datei recht 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()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X