Groovy Grails, How do you stream or buffer a large file in a Controller's response?

14,283

Groovy OutputStreams can take InputStreams directly with the << operator. The OutputStream will pull the data automatically with an appropriately sized buffer.

The following should efficiently copy the data, even if the CSV is quite large.

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()
Share:
14,283

Related videos on Youtube

Julian Noye
Author by

Julian Noye

Updated on April 22, 2022

Comments

  • Julian Noye
    Julian Noye about 2 years

    I have a controller that makes a connection to a url to retrieve a csv file.

    I am able to send the file in the response using the following code, this works fine.

        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()
    

    However I think this method is inappropriate for a large file, as the whole file is loaded into the controllers memory.

    I want to be able to read the file chunk by chunk and write the file to the response chunk by chunk.

    Any ideas?

  • stenix
    stenix almost 9 years
    Good solution, but remember to close the inputStream as well. A safe alternative is to use connection.withInputStream{...}