Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 872
Julian Noye Avatar asked May 13 '10 04:05

Julian Noye


1 Answers

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()
like image 100
ataylor Avatar answered Sep 22 '22 02:09

ataylor